File tree 9 files changed +36
-18
lines changed
regression/cbmc/ts18661_typedefs 9 files changed +36
-18
lines changed Original file line number Diff line number Diff line change 1
- #if defined(__GNUC__ ) && !defined(__clang__ )
1
+ #if defined(__GNUC__ )
2
+
3
+ #ifdef __clang__
4
+
5
+ #define HAS_FLOAT128
6
+
7
+ #else
2
8
3
9
#include <features.h> // For __GNUC_PREREQ
4
10
10
16
11
17
#if __GNUC__ >= 7
12
18
#define HAS_FLOATN
13
- #elif __GNUC_PREREQ (4 , FLOAT128_MINOR_VERSION )
19
+ #endif
20
+
21
+ #if __GNUC_PREREQ (4 , FLOAT128_MINOR_VERSION )
14
22
#define HAS_FLOAT128
15
23
#endif
16
24
17
25
#endif
18
26
19
- #ifndef HAS_FLOATN
27
+ #endif
28
+
29
+ #ifdef HAS_FLOATN
30
+ typedef _Float32 f1 ;
31
+ typedef _Float32x f2 ;
32
+ typedef _Float64 f3 ;
33
+ typedef _Float64x f4 ;
34
+ typedef _Float128 f5 ;
35
+ typedef _Float128x f6 ;
36
+ #else
20
37
typedef float _Float32 ;
21
38
typedef double _Float32x ;
22
39
typedef double _Float64 ;
23
40
typedef long double _Float64x ;
41
+ typedef long double _Float128 ;
24
42
typedef long double _Float128x ;
25
43
#endif
26
44
27
- #if !defined(HAS_FLOATN ) && !defined(HAS_FLOAT128 )
28
- typedef long double _Float128 ;
45
+ #if defined(HAS_FLOAT128 )
46
+ typedef __float128 f7 ;
47
+ #else
48
+ typedef long double __float128 ;
29
49
#endif
30
50
31
51
int main (int argc , char * * argv ) {
Original file line number Diff line number Diff line change @@ -208,7 +208,8 @@ void ansi_c_internal_additions(std::string &code)
208
208
// https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
209
209
// For clang, __float128 is a keyword.
210
210
// For gcc, this is a typedef and not a keyword.
211
- if (config.ansi_c .mode != configt::ansi_ct::flavourt::CLANG)
211
+ if (config.ansi_c .mode != configt::ansi_ct::flavourt::CLANG &&
212
+ config.ansi_c .gcc__float128_type )
212
213
code += " typedef " CPROVER_PREFIX " Float128 __float128;\n " ;
213
214
}
214
215
else if (config.ansi_c .arch == " ppc64le" )
@@ -222,7 +223,8 @@ void ansi_c_internal_additions(std::string &code)
222
223
// https://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
223
224
// For clang, __float128 is a keyword.
224
225
// For gcc, this is a typedef and not a keyword.
225
- if (config.ansi_c .mode != configt::ansi_ct::flavourt::CLANG)
226
+ if (config.ansi_c .mode != configt::ansi_ct::flavourt::CLANG &&
227
+ config.ansi_c .gcc__float128_type )
226
228
code+=" typedef long double __float128;\n " ;
227
229
}
228
230
Original file line number Diff line number Diff line change @@ -76,7 +76,6 @@ bool ansi_c_languaget::parse(
76
76
ansi_c_parser.set_message_handler (get_message_handler ());
77
77
ansi_c_parser.for_has_scope =config.ansi_c .for_has_scope ;
78
78
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 ;
80
79
ansi_c_parser.cpp98 =false ; // it's not C++
81
80
ansi_c_parser.cpp11 =false ; // it's not C++
82
81
ansi_c_parser.mode =config.ansi_c .mode ;
Original file line number Diff line number Diff line change @@ -36,8 +36,7 @@ class ansi_c_parsert:public parsert
36
36
cpp98 (false ),
37
37
cpp11 (false ),
38
38
for_has_scope (false ),
39
- ts_18661_3_Floatn_types(false ),
40
- Float128_type(false )
39
+ ts_18661_3_Floatn_types(false )
41
40
{
42
41
}
43
42
@@ -84,9 +83,6 @@ class ansi_c_parsert:public parsert
84
83
// ISO/IEC TS 18661-3:2015
85
84
bool ts_18661_3_Floatn_types;
86
85
87
- // Does the compiler version emulated provide _Float128?
88
- bool Float128_type;
89
-
90
86
typedef ansi_c_identifiert identifiert;
91
87
typedef ansi_c_scopet scopet;
92
88
Original file line number Diff line number Diff line change @@ -565,7 +565,7 @@ void ansi_c_scanner_init()
565
565
return make_identifier ();
566
566
}
567
567
568
- " _Float128" { if (PARSER.Float128_type )
568
+ " _Float128" { if (PARSER.ts_18661_3_Floatn_types )
569
569
{ loc (); return TOK_GCC_FLOAT128; }
570
570
else
571
571
return make_identifier ();
Original file line number Diff line number Diff line change @@ -25,7 +25,6 @@ bool cpp_parsert::parse()
25
25
config.cpp .cpp_standard ==configt::cppt::cpp_standardt::CPP11 ||
26
26
config.cpp .cpp_standard ==configt::cppt::cpp_standardt::CPP14;
27
27
ansi_c_parser.ts_18661_3_Floatn_types =false ;
28
- ansi_c_parser.Float128_type = false ;
29
28
ansi_c_parser.in =in;
30
29
ansi_c_parser.mode =mode;
31
30
ansi_c_parser.set_file (get_file ());
Original file line number Diff line number Diff line change @@ -539,7 +539,9 @@ int gcc_modet::doit()
539
539
const auto gcc_float128_minor_version =
540
540
config.ansi_c .arch == " x86_64" ? 3u : 5u ;
541
541
542
- config.ansi_c .Float128_type =
542
+ // __float128 exists (as a typedef) since gcc 4.5 everywhere,
543
+ // and since 4.3 on x86_64
544
+ config.ansi_c .gcc__float128_type =
543
545
gcc_version.flavor == gcc_versiont::flavort::GCC &&
544
546
gcc_version.is_at_least (4u , gcc_float128_minor_version);
545
547
Original file line number Diff line number Diff line change @@ -948,7 +948,7 @@ bool configt::set(const cmdlinet &cmdline)
948
948
}
949
949
950
950
if (ansi_c.preprocessor == ansi_ct::preprocessort::GCC)
951
- ansi_c.Float128_type = true ;
951
+ ansi_c.gcc__float128_type = true ;
952
952
953
953
set_arch (arch);
954
954
Original file line number Diff line number Diff line change @@ -44,7 +44,7 @@ class configt
44
44
bool char_is_unsigned, wchar_t_is_unsigned;
45
45
bool for_has_scope;
46
46
bool ts_18661_3_Floatn_types; // ISO/IEC TS 18661-3:2015
47
- bool Float128_type;
47
+ bool gcc__float128_type; // __float128, a gcc extension since 4.3/4.5
48
48
bool single_precision_constant;
49
49
enum class c_standardt { C89, C99, C11 } c_standard;
50
50
static c_standardt default_c_standard ();
You can’t perform that action at this time.
0 commit comments