File tree Expand file tree Collapse file tree 6 files changed +73
-7
lines changed Expand file tree Collapse file tree 6 files changed +73
-7
lines changed Original file line number Diff line number Diff line change 11
2+ == `ct_check.hpp`  
3+ 
4+ `ct_check` is a construct that can be used to emit user-generated
5+ compile-time diagnostics. It uses `ct_string`.
6+ 
7+ For example:
8+ [source,cpp]
9+ ---- 
10+ stdx::ct_check<std::is_integral<float>>.emit<"This is not a very helpful error message">(); 
11+ ---- 
12+ 
13+ The output from this (which varies by compiler) will contain the string given,
14+ and could be something like:
15+ [source,bash]
16+ ---- 
17+ main.cpp:14:27: error: no matching member function for call to 'emit' 
18+    14 |     stdx::ct_check<false>.emit<"This is not a very helpful error message">(); 
19+       |     ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
20+ include/stdx/ct_string.hpp:131:27: note: candidate template ignored: constraints not satisfied 
21+ [with S = ct_string<41>{{"This is not a very helpful error m[...]"}}] 
22+   131 |     constexpr static auto emit() 
23+       |                           ^ 
24+ include/stdx/ct_string.hpp:132:18: note: because 
25+ 'diagnostic<ct_string<41>{{"This is not a very helpful error message"}}>' evaluated to false 
26+   132 |         requires diagnostic<S> 
27+       |                  ^ 
28+ ---- 
29+ 
30+ Notice that the error message is elided at first, but then given in full. Such
31+ are the quirks of compilers. If the compile-time condition is true, of course no
32+ diagnostic will be emitted.
33+ 
34+ NOTE: clang produces these "string-formatted" errors from version 15 onwards; GCC
35+ produces them from version 13.2 onwards.
36+ 
237== `ct_conversions.hpp`
338
439https://github.com/intel/cpp-std-extensions/blob/main/include/stdx/ct_conversions.hpp[`ct_conversions.hpp`]
Original file line number Diff line number Diff line change 4343#define  LIFETIMEBOUND 
4444#endif 
4545#endif 
46+ 
47+ #define  STDX_DO_PRAGMA (X ) _Pragma (#X)
48+ #ifdef  __clang__
49+ #define  STDX_PRAGMA (X ) STDX_DO_PRAGMA(clang X)
50+ #else 
51+ #define  STDX_PRAGMA (X ) STDX_DO_PRAGMA(GCC X)
52+ #endif 
Original file line number Diff line number Diff line change @@ -124,6 +124,17 @@ template <ct_string S> CONSTEVAL auto operator""_cts() { return S; }
124124} //  namespace ct_string_literals
125125} //  namespace literals
126126
127+ template  <bool  B> struct  ct_check_t  {
128+     template  <ct_string S> constexpr  static  bool  diagnostic = false ;
129+     template  <ct_string S>
130+     constexpr  static  auto  emit () -> void
131+         requires diagnostic<S>;
132+ };
133+ template  <> struct  ct_check_t <true > {
134+     template  <ct_string S> constexpr  static  auto  emit () -> void {}
135+ };
136+ template  <bool  B> constexpr  auto  ct_check = ct_check_t <B>{};
137+ 
127138} //  namespace v1
128139} //  namespace stdx
129140
Original file line number Diff line number Diff line change @@ -186,13 +186,6 @@ constexpr auto is_aligned_with = [](auto v) -> bool {
186186#define  FWD (x ) std::forward<decltype (x)>(x)
187187#endif 
188188
189- #define  STDX_DO_PRAGMA (X ) _Pragma (#X)
190- #ifdef  __clang__
191- #define  STDX_PRAGMA (X ) STDX_DO_PRAGMA(clang X)
192- #else 
193- #define  STDX_PRAGMA (X ) STDX_DO_PRAGMA(GCC X)
194- #endif 
195- 
196189#ifndef  CX_VALUE
197190#define  CX_VALUE (...)                                                          \
198191    [] {                                                                       \
Original file line number Diff line number Diff line change @@ -25,6 +25,15 @@ add_fail_tests(
2525    to_address_undefined_on_function)
2626
2727if (${CMAKE_CXX_STANDARD}  GREATER_EQUAL  20)
28+     if (${CMAKE_CXX_COMPILER_ID}  STREQUAL  "Clang" 
29+        AND  ${CMAKE_CXX_COMPILER_VERSION}  VERSION_GREATER_EQUAL  15)
30+         add_fail_tests(ct_check)
31+     endif ()
32+     if (${CMAKE_CXX_COMPILER_ID}  STREQUAL  "GNU"  AND  ${CMAKE_CXX_COMPILER_VERSION} 
33+                                                    VERSION_GREATER_EQUAL  13.2)
34+         add_fail_tests(ct_check)
35+     endif ()
36+ 
2837    add_fail_tests(
2938        dynamic_span_no_ct_capacity
3039        dynamic_container_no_ct_capacity
Original file line number Diff line number Diff line change 1+ #include  < stdx/ct_string.hpp> 
2+ 
3+ //  EXPECT: 01234567890123456789012345678901234567890123456789
4+ 
5+ constexpr  auto  msg =
6+     stdx::ct_string{" 01234567890123456789012345678901234567890123456789" 
7+ 
8+ auto  main () -> int {
9+     stdx::ct_check<true >.emit <" not emitted" 
10+     stdx::ct_check<false >.emit <msg>();
11+ }
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments