diff --git a/src/ansi-c/ansi_c_parser.h b/src/ansi-c/ansi_c_parser.h index 6128b1b56b9..169a74dc4cf 100644 --- a/src/ansi-c/ansi_c_parser.h +++ b/src/ansi-c/ansi_c_parser.h @@ -61,8 +61,8 @@ class ansi_c_parsert:public parsert typedef configt::ansi_ct::flavourt modet; modet mode; - // recognize C++98 and C++11 keywords - bool cpp98, cpp11; + // recognize C++98, C++11, C17, C23 keywords + bool cpp98, cpp11, c17, c23; // in C99 and upwards, for(;;) has a scope bool for_has_scope; diff --git a/src/ansi-c/c_preprocess.cpp b/src/ansi-c/c_preprocess.cpp index afe51b01010..c6190dd1fd3 100644 --- a/src/ansi-c/c_preprocess.cpp +++ b/src/ansi-c/c_preprocess.cpp @@ -589,6 +589,24 @@ bool c_preprocess_gcc_clang( #endif argv.push_back("-std=gnu11"); break; + + case configt::ansi_ct::c_standardt::C17: +#if defined(__OpenBSD__) + if(preprocessor == configt::ansi_ct::preprocessort::CLANG) + argv.push_back("-std=c17"); + else +#endif + argv.push_back("-std=gnu17"); + break; + + case configt::ansi_ct::c_standardt::C23: +#if defined(__OpenBSD__) + if(preprocessor == configt::ansi_ct::preprocessort::CLANG) + argv.push_back("-std=c23"); + else +#endif + argv.push_back("-std=gnu23"); + break; } } @@ -672,6 +690,7 @@ bool c_preprocess_arm( argv.push_back("--signed_chars"); // Set the standard + // https://developer.arm.com/documentation/101458/2404/Standards-support/Supported-C-C---standards-in-Arm-C-C---Compiler switch(config.ansi_c.c_standard) { case configt::ansi_ct::c_standardt::C89: @@ -679,9 +698,21 @@ bool c_preprocess_arm( break; case configt::ansi_ct::c_standardt::C99: - case configt::ansi_ct::c_standardt::C11: argv.push_back("--c99"); break; + + case configt::ansi_ct::c_standardt::C11: + argv.push_back("--c11"); + break; + + case configt::ansi_ct::c_standardt::C17: + argv.push_back("--c17"); + break; + + case configt::ansi_ct::c_standardt::C23: + // C23 is not yet supported by armcc + argv.push_back("--c17"); + break; } for(const auto &define : config.ansi_c.defines) diff --git a/src/ansi-c/scanner.l b/src/ansi-c/scanner.l index ad408dbeb31..ae9ef2422af 100644 --- a/src/ansi-c/scanner.l +++ b/src/ansi-c/scanner.l @@ -171,6 +171,28 @@ int cpp11_keyword(int token) return make_identifier(); } +int c17_keyword(int token) +{ + if(PARSER.c17) + { + loc(); + return token; + } + else + return make_identifier(); +} + +int c23_keyword(int token) +{ + if(PARSER.c23) + { + loc(); + return token; + } + else + return make_identifier(); +} + int MSC_cpp_keyword(int token) { if(PARSER.cpp98 && PARSER.mode==configt::ansi_ct::flavourt::VISUAL_STUDIO) diff --git a/src/util/config.h b/src/util/config.h index f1ef547cc4a..7189453663c 100644 --- a/src/util/config.h +++ b/src/util/config.h @@ -45,6 +45,12 @@ class symbol_table_baset; : configt::ansi_ct::default_c_standard() == \ configt::ansi_ct::c_standardt::C11 \ ? "c11" \ + : configt::ansi_ct::default_c_standard() == \ + configt::ansi_ct::c_standardt::C17 \ + ? "c17" \ + : configt::ansi_ct::default_c_standard() == \ + configt::ansi_ct::c_standardt::C23 \ + ? "c23" \ : "") + \ ")\n" \ " {y--cpp98}, {y--cpp03}, {y--cpp11} \t " \ @@ -166,7 +172,9 @@ class configt { C89, C99, - C11 + C11, + C17, + C23 } c_standard; static c_standardt default_c_standard(); @@ -185,6 +193,16 @@ class configt c_standard = c_standardt::C11; for_has_scope = true; } + void set_c17() + { + c_standard = c_standardt::C17; + for_has_scope = true; + } + void set_c23() + { + c_standard = c_standardt::C23; + for_has_scope = true; + } ieee_floatt::rounding_modet rounding_mode;