Skip to content

Commit 854e013

Browse files
authored
Merge pull request #8620 from diffblue/c23
C17 and C23 support
2 parents 10a14c9 + 4531fa6 commit 854e013

File tree

4 files changed

+75
-4
lines changed

4 files changed

+75
-4
lines changed

src/ansi-c/ansi_c_parser.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ class ansi_c_parsert:public parsert
6161
typedef configt::ansi_ct::flavourt modet;
6262
modet mode;
6363

64-
// recognize C++98 and C++11 keywords
65-
bool cpp98, cpp11;
64+
// recognize C++98, C++11, C17, C23 keywords
65+
bool cpp98, cpp11, c17, c23;
6666

6767
// in C99 and upwards, for(;;) has a scope
6868
bool for_has_scope;

src/ansi-c/c_preprocess.cpp

+32-1
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,24 @@ bool c_preprocess_gcc_clang(
589589
#endif
590590
argv.push_back("-std=gnu11");
591591
break;
592+
593+
case configt::ansi_ct::c_standardt::C17:
594+
#if defined(__OpenBSD__)
595+
if(preprocessor == configt::ansi_ct::preprocessort::CLANG)
596+
argv.push_back("-std=c17");
597+
else
598+
#endif
599+
argv.push_back("-std=gnu17");
600+
break;
601+
602+
case configt::ansi_ct::c_standardt::C23:
603+
#if defined(__OpenBSD__)
604+
if(preprocessor == configt::ansi_ct::preprocessort::CLANG)
605+
argv.push_back("-std=c23");
606+
else
607+
#endif
608+
argv.push_back("-std=gnu23");
609+
break;
592610
}
593611
}
594612

@@ -672,16 +690,29 @@ bool c_preprocess_arm(
672690
argv.push_back("--signed_chars");
673691

674692
// Set the standard
693+
// https://developer.arm.com/documentation/101458/2404/Standards-support/Supported-C-C---standards-in-Arm-C-C---Compiler
675694
switch(config.ansi_c.c_standard)
676695
{
677696
case configt::ansi_ct::c_standardt::C89:
678697
argv.push_back("--c90");
679698
break;
680699

681700
case configt::ansi_ct::c_standardt::C99:
682-
case configt::ansi_ct::c_standardt::C11:
683701
argv.push_back("--c99");
684702
break;
703+
704+
case configt::ansi_ct::c_standardt::C11:
705+
argv.push_back("--c11");
706+
break;
707+
708+
case configt::ansi_ct::c_standardt::C17:
709+
argv.push_back("--c17");
710+
break;
711+
712+
case configt::ansi_ct::c_standardt::C23:
713+
// C23 is not yet supported by armcc
714+
argv.push_back("--c17");
715+
break;
685716
}
686717

687718
for(const auto &define : config.ansi_c.defines)

src/ansi-c/scanner.l

+22
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,28 @@ int cpp11_keyword(int token)
171171
return make_identifier();
172172
}
173173

174+
int c17_keyword(int token)
175+
{
176+
if(PARSER.c17)
177+
{
178+
loc();
179+
return token;
180+
}
181+
else
182+
return make_identifier();
183+
}
184+
185+
int c23_keyword(int token)
186+
{
187+
if(PARSER.c23)
188+
{
189+
loc();
190+
return token;
191+
}
192+
else
193+
return make_identifier();
194+
}
195+
174196
int MSC_cpp_keyword(int token)
175197
{
176198
if(PARSER.cpp98 && PARSER.mode==configt::ansi_ct::flavourt::VISUAL_STUDIO)

src/util/config.h

+19-1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ class symbol_table_baset;
4545
: configt::ansi_ct::default_c_standard() == \
4646
configt::ansi_ct::c_standardt::C11 \
4747
? "c11" \
48+
: configt::ansi_ct::default_c_standard() == \
49+
configt::ansi_ct::c_standardt::C17 \
50+
? "c17" \
51+
: configt::ansi_ct::default_c_standard() == \
52+
configt::ansi_ct::c_standardt::C23 \
53+
? "c23" \
4854
: "") + \
4955
")\n" \
5056
" {y--cpp98}, {y--cpp03}, {y--cpp11} \t " \
@@ -166,7 +172,9 @@ class configt
166172
{
167173
C89,
168174
C99,
169-
C11
175+
C11,
176+
C17,
177+
C23
170178
} c_standard;
171179
static c_standardt default_c_standard();
172180
@@ -185,6 +193,16 @@ class configt
185193
c_standard = c_standardt::C11;
186194
for_has_scope = true;
187195
}
196+
void set_c17()
197+
{
198+
c_standard = c_standardt::C17;
199+
for_has_scope = true;
200+
}
201+
void set_c23()
202+
{
203+
c_standard = c_standardt::C23;
204+
for_has_scope = true;
205+
}
188206
189207
ieee_floatt::rounding_modet rounding_mode;
190208

0 commit comments

Comments
 (0)