File tree Expand file tree Collapse file tree 7 files changed +19
-2
lines changed Expand file tree Collapse file tree 7 files changed +19
-2
lines changed Original file line number Diff line number Diff line change @@ -76,6 +76,7 @@ bool ansi_c_languaget::parse(
7676 ansi_c_parser.set_message_handler (get_message_handler ());
7777 ansi_c_parser.for_has_scope =config.ansi_c .for_has_scope ;
7878 ansi_c_parser.ts_18661_3_Floatn_types =config.ansi_c .ts_18661_3_Floatn_types ;
79+ ansi_c_parser.Float128_type =config.ansi_c .Float128_type ;
7980 ansi_c_parser.cpp98 =false ; // it's not C++
8081 ansi_c_parser.cpp11 =false ; // it's not C++
8182 ansi_c_parser.mode =config.ansi_c .mode ;
Original file line number Diff line number Diff line change @@ -36,7 +36,8 @@ class ansi_c_parsert:public parsert
3636 cpp98 (false ),
3737 cpp11 (false ),
3838 for_has_scope (false ),
39- ts_18661_3_Floatn_types(false )
39+ ts_18661_3_Floatn_types(false ),
40+ Float128_type(false )
4041 {
4142 }
4243
@@ -81,6 +82,9 @@ class ansi_c_parsert:public parsert
8182 // ISO/IEC TS 18661-3:2015
8283 bool ts_18661_3_Floatn_types;
8384
85+ // Does the compiler version emulated provide _Float128?
86+ bool Float128_type;
87+
8488 typedef ansi_c_identifiert identifiert;
8589 typedef ansi_c_scopet scopet;
8690
Original file line number Diff line number Diff line change @@ -503,7 +503,7 @@ void ansi_c_scanner_init()
503503 return make_identifier ();
504504 }
505505
506- " _Float128" { if (PARSER.ts_18661_3_Floatn_types )
506+ " _Float128" { if (PARSER.Float128_type )
507507 { loc (); return TOK_GCC_FLOAT128; }
508508 else
509509 return make_identifier ();
Original file line number Diff line number Diff line change @@ -25,6 +25,7 @@ bool cpp_parsert::parse()
2525 config.cpp .cpp_standard ==configt::cppt::cpp_standardt::CPP11 ||
2626 config.cpp .cpp_standard ==configt::cppt::cpp_standardt::CPP14;
2727 ansi_c_parser.ts_18661_3_Floatn_types =false ;
28+ ansi_c_parser.Float128_type = false ;
2829 ansi_c_parser.in =in;
2930 ansi_c_parser.mode =mode;
3031 ansi_c_parser.set_file (get_file ());
Original file line number Diff line number Diff line change @@ -530,6 +530,13 @@ int gcc_modet::doit()
530530 gcc_version.is_at_least (7 ))
531531 config.ansi_c .ts_18661_3_Floatn_types =true ;
532532
533+ int gcc_float128_minor_version =
534+ config.ansi_c .arch == " x86_64" ? 3 : 5 ;
535+
536+ config.ansi_c .Float128_type =
537+ gcc_version.flavor ==gcc_versiont::flavort::GCC &&
538+ gcc_version.is_at_least (4 , gcc_float128_minor_version);
539+
533540 // -fshort-double makes double the same as float
534541 if (cmdline.isset (" fshort-double" ))
535542 config.ansi_c .double_width =config.ansi_c .single_width ;
Original file line number Diff line number Diff line change @@ -912,6 +912,9 @@ bool configt::set(const cmdlinet &cmdline)
912912 ansi_c.preprocessor =ansi_ct::preprocessort::GCC;
913913 }
914914
915+ if (ansi_c.preprocessor == ansi_ct::preprocessort::GCC)
916+ ansi_c.Float128_type = true ;
917+
915918 set_arch (arch);
916919
917920 if (os==" windows" )
Original file line number Diff line number Diff line change @@ -43,6 +43,7 @@ class configt
4343 bool char_is_unsigned, wchar_t_is_unsigned;
4444 bool for_has_scope;
4545 bool ts_18661_3_Floatn_types; // ISO/IEC TS 18661-3:2015
46+ bool Float128_type;
4647 bool single_precision_constant;
4748 enum class c_standardt { C89, C99, C11 } c_standard;
4849 static c_standardt default_c_standard ();
You can’t perform that action at this time.
0 commit comments