|
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