@@ -210,6 +210,26 @@ static void set_std(bool is_iso, const char *arg) {
210210 error ("unknown c standard" );
211211}
212212
213+ static void set_std_iso (const char * arg ) {
214+ char * end ;
215+ int val = strtoul (arg , & end , 10 );
216+
217+ if (end != arg ) {
218+ is_iso_std = true;
219+
220+ switch (val ) {
221+ case 1990 : opt_std = STD_C89 ; return ;
222+ case 199409 : opt_std = STD_C94 ; return ;
223+ case 1999 : opt_std = STD_C99 ; return ;
224+ case 2011 : opt_std = STD_C11 ; return ;
225+ case 2017 :
226+ case 2018 : opt_std = STD_C17 ; return ;
227+ case 2024 : opt_std = STD_C23 ; return ;
228+ }
229+ }
230+ error ("unknown c standard" );
231+ }
232+
213233void set_fpic (const char * lvl ) {
214234 opt_fpic = true;
215235 opt_fpie = false;
@@ -246,11 +266,18 @@ static void build_macros(MacroChangeArr *arr, bool is_asm_pp) {
246266 define_macro ("__STRICT_ANSI__" , "1" );
247267
248268 switch (opt_std ) {
269+ case STD_C94 : define_macro ("__STDC_VERSION__" , "199409L" ); break ;
249270 case STD_C99 : define_macro ("__STDC_VERSION__" , "199901L" ); break ;
250271 case STD_C11 : define_macro ("__STDC_VERSION__" , "201112L" ); break ;
251272 case STD_C17 : define_macro ("__STDC_VERSION__" , "201710L" ); break ;
252273 case STD_C23 : define_macro ("__STDC_VERSION__" , "202311L" ); break ;
253274 }
275+
276+ if (opt_std >= STD_C99 )
277+ define_macro ("__GNUC_STDC_INLINE__" , "1" );
278+
279+ define_macro ("__STDC_UTF_16__" , "1" );
280+ define_macro ("__STDC_UTF_32__" , "1" );
254281 }
255282
256283 for (int i = 0 ; i < arr -> len ; i ++ ) {
@@ -594,6 +621,8 @@ static void parse_args(int argc, char **argv, bool *run_ld, bool *no_fork) {
594621 set_std (true, arg );
595622 else if (startswith (arg , & arg , "gnu" ))
596623 set_std (false, arg );
624+ else if (startswith (arg , & arg , "iso9899:" ))
625+ set_std_iso (arg );
597626 else
598627 error ("unknown c standard" );
599628 continue ;
0 commit comments