diff options
| -rw-r--r-- | clang/docs/LanguageExtensions.rst | 8 | ||||
| -rw-r--r-- | clang/lib/Lex/PPMacroExpansion.cpp | 11 | ||||
| -rw-r--r-- | clang/test/Lexer/has_feature_cxx0x.cpp | 20 |
3 files changed, 32 insertions, 7 deletions
diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst index 899ce728ba8..8a5c9d75da9 100644 --- a/clang/docs/LanguageExtensions.rst +++ b/clang/docs/LanguageExtensions.rst @@ -750,16 +750,16 @@ for default initializers in aggregate members is enabled. C++1y generalized lambda capture ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Use ``__has_feature(cxx_init_capture)`` or -``__has_extension(cxx_init_capture)`` to determine if support for +Use ``__has_feature(cxx_init_captures)`` or +``__has_extension(cxx_init_captures)`` to determine if support for lambda captures with explicit initializers is enabled (for instance, ``[n(0)] { return ++n; }``). C++1y generic lambdas ^^^^^^^^^^^^^^^^^^^^^ -Use ``__has_feature(cxx_generic_lambda)`` or -``__has_extension(cxx_generic_lambda)`` to determine if support for generic +Use ``__has_feature(cxx_generic_lambdas)`` or +``__has_extension(cxx_generic_lambdas)`` to determine if support for generic (polymorphic) lambdas is enabled (for instance, ``[] (auto x) { return x + 1; }``). diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp index cd96f8cf34c..fa517e7fa81 100644 --- a/clang/lib/Lex/PPMacroExpansion.cpp +++ b/clang/lib/Lex/PPMacroExpansion.cpp @@ -918,7 +918,7 @@ static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) { .Case("c_atomic", LangOpts.C11) .Case("c_generic_selections", LangOpts.C11) .Case("c_static_assert", LangOpts.C11) - .Case("c_thread_local", + .Case("c_thread_local", LangOpts.C11 && PP.getTargetInfo().isTLSSupported()) // C++11 features .Case("cxx_access_control_sfinae", LangOpts.CPlusPlus11) @@ -962,12 +962,17 @@ static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) { .Case("cxx_aggregate_nsdmi", LangOpts.CPlusPlus1y) .Case("cxx_binary_literals", LangOpts.CPlusPlus1y) .Case("cxx_contextual_conversions", LangOpts.CPlusPlus1y) - //.Case("cxx_generic_lambdas", LangOpts.CPlusPlus1y) + .Case("cxx_decltype_auto", LangOpts.CPlusPlus1y) + .Case("cxx_generic_lambdas", LangOpts.CPlusPlus1y) .Case("cxx_init_captures", LangOpts.CPlusPlus1y) .Case("cxx_relaxed_constexpr", LangOpts.CPlusPlus1y) .Case("cxx_return_type_deduction", LangOpts.CPlusPlus1y) - //.Case("cxx_runtime_arrays", LangOpts.CPlusPlus1y) .Case("cxx_variable_templates", LangOpts.CPlusPlus1y) + // C++ TSes + //.Case("cxx_runtime_arrays", LangOpts.CPlusPlusTSArrays) + //.Case("cxx_concepts", LangOpts.CPlusPlusTSConcepts) + // FIXME: Should this be __has_feature or __has_extension? + //.Case("raw_invocation_type", LangOpts.CPlusPlus) // Type traits .Case("has_nothrow_assign", LangOpts.CPlusPlus) .Case("has_nothrow_copy", LangOpts.CPlusPlus) diff --git a/clang/test/Lexer/has_feature_cxx0x.cpp b/clang/test/Lexer/has_feature_cxx0x.cpp index b2fe842bd67..e558f8804b2 100644 --- a/clang/test/Lexer/has_feature_cxx0x.cpp +++ b/clang/test/Lexer/has_feature_cxx0x.cpp @@ -396,3 +396,23 @@ int no_init_captures(); // CHECK-1Y: has_init_captures // CHECK-11: no_init_captures // CHECK-NO-11: no_init_captures + +#if __has_feature(cxx_decltype_auto) +int has_decltype_auto(); +#else +int no_decltype_auto(); +#endif + +// CHECK-1Y: has_decltype_auto +// CHECK-11: no_decltype_auto +// CHECK-NO-11: no_decltype_auto + +#if __has_feature(cxx_generic_lambdas) +int has_generic_lambdas(); +#else +int no_generic_lambdas(); +#endif + +// CHECK-1Y: has_generic_lambdas +// CHECK-11: no_generic_lambdas +// CHECK-NO-11: no_generic_lambdas |

