# hare-c ## Checklist ``` basics 🗸 comments 🗸 block 🗸 line 🗸 backslashes at end of line declarations specifiers type specifiers 🗸 signed, unsigned 🗸 void 🗸 char 🗸 short 🗸 int 🗸 long 🗸 float 🗸 double struct bit-fields declarations named anonymous definitions forward union bit-fields prohibited declarations named anonymous definitions forward 🗸 enum 🗸 declarations 🗸 named 🗸 anonymous 🗸 definitions 🗸 forward 🗸 fields inserted into scope 🗸 typedefs 🗸 storage specifiers 🗸 auto 🗸 static 🗸 register 🗸 extern 🗸 typedef 🗸 duplicate specifiers 🗸 disallowed for type specifiers 🗸 allowed for other specifiers disallow incompatible 🗸 type specifiers other specifiers 🗸 qualifiers 🗸 allowed in any order 🗸 duplicates allowed 🗸 declarators 🗸 pointer 🗸 function 🗸 named parameters 🗸 anonymous parameters 🗸 array qualifiers apply to element type ...except as inner-most declarator of function parameter 🗸 identifier only 🗸 parenthesized 🗸 type names 🗸 with declarator 🗸 without declarator scopes 🗸 file block duplicates file scope allowed for compatible declarations equivalent types composite type initializers must be equal (TODO find this in spec) disallowed for incompatible declarations 🗸 block scope 🗸 disallowed within same scope 🗸 shadowing in nested scopes 🗸 shadowing block-scoped declarations 🗸 shadowing file-scoped declarations 🗸 unique namespaces 🗸 identifiers 🗸 struct/union/enum 🗸 goto labels expressions 🗸 int literals 🗸 decimal 🗸 hex 🗸 octal 🗸 suffixes 🗸 u 🗸 l float literals 🗸 decimal exponent 🗸 f suffix 🗸 plain char literals 🗸 plain string literals 🗸 sizeof 🗸 array indexing expressions 🗸 unary postfix expressions 🗸 unary prefix expressions 🗸 binary expressions 🗸 parenthesized expressions 🗸 operator precedence 🗸 casting statements 🗸 goto 🗸 compound labelled goto label case default 🗸 empty 🗸 if 🗸 while 🗸 do-while 🗸 for 🗸 switch 🗸 break, continue 🗸 return array initializers (TODO when were explicit indices added?) 🗸 variadic functions 🗸 function definitions 🗸 without arguments (void) 🗸 with named arguments 🗸 identifiers pre-processor macro definitions #define 🗸 variable-like function-like 🗸 undef macro substitution pre-defined macros 🗸 __STDC__ __STDC_HOSTED__ __FILE__ __LINE__ __DATE__ __TIME__ 🗸 __STDC_IEC_559__ 🗸 __STDC_IEC_559_COMPLEX__ __STDC_ISO_10646__ 🗸 __STDC_UTF_16__ 🗸 __STDC_UTF_32__ 🗸 variable-like function-like pre-processor numbers 🗸 #include 🗸 system headers 🗸 non-system headers 🗸 header exists 🗸 header doesn't exist; fallback to system header 🗸 header name doesn't have angle brackets 🗸 header name has angle brackets macro expansion 🗸 is lexed as a system header string literal 🗸 true in #include 🗸 false everywhere else conditional #if, #endif 🗸 #else #elif defined 🗸 #ifdef 🗸 #ifndef #error 🗸 errors out 🗸 error message uses all tokens macros are expanded 🗸 #line 🗸 only change line number 🗸 also change filename macros are expanded legacy 🗸 trigraphs 🗸 k&r-style functions 🗸 empty parameter list 🗸 non-empty parameter list without types 🗸 k&r-style parameter declarations 🗸 implicit int implicit function declaration 🗸 c95 🗸 digraphs 🗸 __STDC_VERSION__ c99 pragma #pragma _Pragma STDC accept standardized FP_CONTRACT FENV_ACCESS CX_LIMITED_RANGE reject unstandardized 🗸 implementation-defined 🗸 accepted 🗸 ignored 🗸 VLAs hex float literals (TODO was this c99?) 🗸 hex prefix / base hex exponent universal character names 🗸 in char/string literals in identifiers 🗸 struct initializers 🗸 as initializer of declaration 🗸 in cast expression (compound literal) 🗸 declaration as for-loop initializer 🗸 specifiers 🗸 type specifiers 🗸 _Complex 🗸 _Imaginary 🗸 long double 🗸 inline 🗸 static array parameters 🗸 restrict variadic macros use of ... in definition __VA_ARGS__ 🗸 intermixing declarations and statements in compound statements literal prefixes/suffixes L prefix (TODO was this c99?) char literals string literals ll int literal suffix l float literal suffix c11 specifiers _Thread_local 🗸 _Noreturn 🗸 _Alignas _Atomic as specifier as qualifier _Static_assert 🗸 parse 🗸 top-level 🗸 within function within struct eval top-level within function within struct 🗸 expression 🗸 type 🗸 _Alignof 🗸 _Generic 🗸 prefixes 🗸 char literals 🗸 u8- 🗸 u- 🗸 U- 🗸 string literals 🗸 u- 🗸 U- nested anonymous structs/unions c23 unicode identifiers specifiers _BitInt 🗸 signed 🗸 unsigned wb int literal suffix 🗸 typeof 🗸 qualified (typeof) 🗸 unqualified (typeof_unqual) 🗸 constexpr pre-processor #embed #warning actually warns 🗸 warning message uses all tokens macros are expanded __has_c_attribute __has_include __VA_OPT__ 🗸 #elifdef, #elifndef 🗸 static_assert without reason type inferencing with auto 🗸 nullptr labels labelled declarations at end of compound statement 🗸 binary int literals function declarations variadic function without parameters parameters in function definition need not be named attributes [[noreturn]] [[deprecated]] [[fallthrough]] [[maybe_unused]] [[nodiscard]] [[reproducible]] [[unsequenced]] vendor-specific duplicates permitted 🗸 u8- string literals empty initializers ' as separator int literals float literals empty declarations 🗸 pre-defined macros 🗸 alignas 🗸 alignof 🗸 bool 🗸 true 🗸 false 🗸 static_assert 🗸 thread_local explicit enum backing type storage specifiers in compound literal type name 🗸 implementation-specific 🗸 redefinition of macros ```