|
1 |
| -// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*- |
2 |
| -// |
3 | 1 | // compiler.h: Rcpp R/C++ interface class library -- check compiler
|
4 | 2 | //
|
5 |
| -// Copyright (C) 2012 - 2013 Dirk Eddelbuettel, Romain Francois, and Kevin Ushey |
| 3 | +// Copyright (C) 2012 - 2025 Dirk Eddelbuettel, Romain Francois, and Kevin Ushey |
6 | 4 | //
|
7 | 5 | // This file is part of Rcpp.
|
8 | 6 | //
|
|
24 | 22 |
|
25 | 23 | // NB: A vast list valid identifiers is at these wiki pages:
|
26 | 24 | // http://sourceforge.net/p/predef/wiki/Home/
|
27 |
| - |
28 |
| -#undef GOOD_COMPILER_FOR_RCPP |
29 |
| -#ifdef __GNUC__ |
30 |
| -#define GOOD_COMPILER_FOR_RCPP |
31 |
| -#endif |
32 |
| -#ifdef __SUNPRO_CC |
33 |
| -#define GOOD_COMPILER_FOR_RCPP |
34 |
| -#endif |
35 |
| -#ifdef __clang__ |
36 |
| -#define GOOD_COMPILER_FOR_RCPP |
37 |
| -#endif |
38 |
| -#ifdef __INTEL_COMPILER |
39 |
| -#define GOOD_COMPILER_FOR_RCPP |
40 |
| -#endif |
41 |
| - |
42 |
| -#ifndef GOOD_COMPILER_FOR_RCPP |
43 |
| -# error "This compiler is not supported" |
44 |
| -#endif |
45 |
| - |
46 |
| -#ifdef __GNUC__ |
47 |
| - #define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) |
48 |
| - // g++ 4.5 does not seem to like some of the fast indexing |
49 |
| - #if GCC_VERSION >= 40500 |
50 |
| - #define IS_GCC_450_OR_LATER |
51 |
| - #endif |
52 |
| - // g++ 4.6 switches from exception_defines.h to bits/exception_defines.h |
53 |
| - #if GCC_VERSION < 40600 |
54 |
| - #define IS_EARLIER_THAN_GCC_460 |
55 |
| - #endif |
56 |
| - #if GCC_VERSION >= 40600 |
57 |
| - #define IS_GCC_460_OR_LATER |
58 |
| - #endif |
59 |
| -#endif |
60 |
| - |
61 |
| -// Check for the presence of C++0x (or later) support |
62 |
| -#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) |
63 |
| - #define RCPP_USING_CXX0X_OR_LATER |
| 25 | +#if !defined(__GNUC__) && !defined(__SUNPRO_CC) && !defined(__clang__) && !defined(__INTEL_COMPILER) |
| 26 | +#error "This compiler is not supported" |
64 | 27 | #endif
|
65 | 28 |
|
66 |
| -// Check C++0x/11 features |
67 |
| -#if defined(__INTEL_COMPILER) |
68 |
| - #if __cplusplus >= 201103L |
69 |
| - #define RCPP_USING_CXX11 |
70 |
| - #if __INTEL_COMPILER >= 1210 |
71 |
| - #define HAS_VARIADIC_TEMPLATES |
72 |
| - #endif |
73 |
| - #if __INTEL_COMPILER >= 1100 |
74 |
| - #define HAS_STATIC_ASSERT |
75 |
| - #endif |
76 |
| - #endif |
77 |
| -#elif defined(__clang__) |
78 |
| - #if __cplusplus >= 201103L |
79 |
| - #define RCPP_USING_CXX11 |
80 |
| - #if __has_feature(cxx_variadic_templates) |
81 |
| - #define HAS_VARIADIC_TEMPLATES |
82 |
| - #endif |
83 |
| - #if __has_feature(cxx_static_assert) |
84 |
| - #define HAS_STATIC_ASSERT |
85 |
| - #endif |
86 |
| - #endif |
87 |
| -#elif defined(__GNUC__) |
88 |
| - #ifdef __GXX_EXPERIMENTAL_CXX0X__ |
89 |
| - #if GCC_VERSION >= 40300 |
90 |
| - #define HAS_VARIADIC_TEMPLATES |
91 |
| - #define HAS_STATIC_ASSERT |
92 |
| - #endif |
93 |
| - #endif |
94 |
| - #if GCC_VERSION >= 40800 && __cplusplus >= 201103L |
95 |
| - #define RCPP_USING_CXX11 |
96 |
| - #endif |
| 29 | +// Simpler test and minimal standard: C++11 or else we die |
| 30 | +#if __cplusplus < 201103L |
| 31 | +#error "The C++ compilation standard is too old: use C++11 or newer." |
97 | 32 | #endif
|
98 | 33 |
|
99 |
| -// Check C++0x headers |
| 34 | +// C++11 features -- that used to be carefully tested for or worked around via CXX0X / TR1 |
| 35 | +// These defines are all planned to get removed just how a number have already been removed. One at a time... |
| 36 | +#define RCPP_USING_CXX11 |
| 37 | +#define HAS_VARIADIC_TEMPLATES |
100 | 38 | #include <cmath>
|
101 |
| -#if defined(__INTEL_COMPILER) || (defined(__GNUC__) && !defined(__clang__)) |
102 |
| - #if defined(__GLIBCXX__) && defined(__GXX_EXPERIMENTAL_CXX0X__) |
103 |
| - #if GCC_VERSION >= 40400 |
104 |
| - #define HAS_CXX0X_UNORDERED_MAP |
105 |
| - #define HAS_CXX0X_UNORDERED_SET |
106 |
| - #define HAS_CXX0X_INITIALIZER_LIST |
107 |
| - #endif |
108 |
| - #endif |
109 |
| -#elif defined(__clang__) |
110 |
| - #if __cplusplus >= 201103L |
111 |
| - #if __has_include(<unordered_map>) |
112 |
| - #define HAS_CXX0X_UNORDERED_MAP |
113 |
| - #endif |
114 |
| - #if __has_include(<unordered_set>) |
115 |
| - #define HAS_CXX0X_UNORDERED_SET |
116 |
| - #endif |
117 |
| - #if __has_include(<initializer_list>) |
118 |
| - #define HAS_CXX0X_INITIALIZER_LIST |
119 |
| - #endif |
120 |
| - #endif |
121 |
| -#endif |
122 |
| - |
123 |
| -// Check TR1 Headers |
124 |
| -#if defined(__INTEL_COMPILER) || (defined(__GNUC__) && !defined(__clang__)) |
125 |
| - #if defined(__GLIBCXX__) |
126 |
| - #if GCC_VERSION >= 40400 || ( GCC_VERSION >= 40201 && defined(__APPLE__) ) |
127 |
| - #define HAS_TR1_UNORDERED_MAP |
128 |
| - #define HAS_TR1_UNORDERED_SET |
129 |
| - #endif |
130 |
| - #endif |
131 |
| -#elif defined(__clang__) |
132 |
| - #if __cplusplus >= 201103L |
133 |
| - #if __has_include(<tr1/unordered_map>) |
134 |
| - #define HAS_TR1_UNORDERED_MAP |
135 |
| - #endif |
136 |
| - #if __has_include(<tr1/unordered_set>) |
137 |
| - #define HAS_TR1_UNORDERED_SET |
138 |
| - #endif |
139 |
| - #endif |
140 |
| -#endif |
141 |
| - |
142 |
| -#if defined(HAS_TR1_UNORDERED_MAP) && defined(HAS_TR1_UNORDERED_SET) |
143 |
| -#define HAS_TR1 |
144 |
| -#endif |
145 |
| - |
146 |
| -// Conditionally include headers |
147 |
| -#ifdef HAS_CXX0X_INITIALIZER_LIST |
148 | 39 | #include <initializer_list>
|
149 |
| -#endif |
150 |
| - |
151 |
| -#ifdef RCPP_USING_CXX11 |
152 |
| - #if defined(HAS_CXX0X_UNORDERED_MAP) |
153 |
| - #include <unordered_map> |
154 |
| - #define RCPP_USING_UNORDERED_MAP |
155 |
| - #define RCPP_UNORDERED_MAP std::unordered_map |
156 |
| - #else |
157 |
| - #include <map> |
158 |
| - #define RCPP_USING_MAP |
159 |
| - #define RCPP_UNORDERED_MAP std::map |
160 |
| - #endif |
161 |
| - #if defined(HAS_CXX0X_UNORDERED_SET) |
162 |
| - #include <unordered_set> |
163 |
| - #define RCPP_USING_UNORDERED_SET |
164 |
| - #define RCPP_UNORDERED_SET std::unordered_set |
165 |
| - #else |
166 |
| - #include <set> |
167 |
| - #define RCPP_USING_SET |
168 |
| - #define RCPP_UNORDERED_SET std::set |
169 |
| - #endif |
170 |
| -#else |
171 |
| - #if defined(HAS_TR1_UNORDERED_MAP) |
172 |
| - #include <tr1/unordered_map> |
173 |
| - #define RCPP_USING_TR1_UNORDERED_MAP |
174 |
| - #define RCPP_UNORDERED_MAP std::tr1::unordered_map |
175 |
| - #else |
176 |
| - #include <map> |
177 |
| - #define RCPP_USING_MAP |
178 |
| - #define RCPP_UNORDERED_MAP std::map |
179 |
| - #endif |
180 |
| - #if defined(HAS_TR1_UNORDERED_SET) |
181 |
| - #include <tr1/unordered_set> |
182 |
| - #define RCPP_USING_TR1_UNORDERED_SET |
183 |
| - #define RCPP_UNORDERED_SET std::tr1::unordered_set |
184 |
| - #else |
185 |
| - #include <set> |
186 |
| - #define RCPP_USING_SET |
187 |
| - #define RCPP_UNORDERED_SET std::set |
188 |
| - #endif |
189 |
| -#endif |
190 |
| - |
191 |
| -#ifdef __GNUC__ |
| 40 | +#include <unordered_map> |
| 41 | +#define RCPP_USING_UNORDERED_MAP |
| 42 | +#define RCPP_UNORDERED_MAP std::unordered_map |
| 43 | +#include <unordered_set> |
| 44 | +#define RCPP_USING_UNORDERED_SET |
| 45 | +#define RCPP_UNORDERED_SET std::unordered_set |
| 46 | + |
| 47 | +#if defined(__GNUC__) |
192 | 48 | #define RCPP_HAS_DEMANGLING
|
193 | 49 | #endif
|
194 | 50 |
|
195 |
| - |
196 | 51 | #endif
|
0 commit comments