]> granicus.if.org Git - clang/commitdiff
C++11 support is now feature-complete.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 19 Apr 2013 17:00:31 +0000 (17:00 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 19 Apr 2013 17:00:31 +0000 (17:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179861 91177308-0d34-0410-b5e6-96231b3b80d8

docs/LanguageExtensions.rst
lib/Lex/PPMacroExpansion.cpp
test/Lexer/has_feature_c1x.c
test/Lexer/has_feature_cxx0x.cpp
www/cxx_status.html
www/index.html

index c870d20b87637a730e8a8d48f42188b05271281e..dbb67f908d13e10a881863f071e4dc477c412915 100644 (file)
@@ -645,8 +645,7 @@ C++11 inheriting constructors
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Use ``__has_feature(cxx_inheriting_constructors)`` to determine if support for
-inheriting constructors is enabled.  Clang does not currently implement this
-feature.
+inheriting constructors is enabled.
 
 C++11 inline namespaces
 ^^^^^^^^^^^^^^^^^^^^^^^
@@ -727,6 +726,12 @@ Use ``__has_feature(cxx_static_assert)`` or
 ``__has_extension(cxx_static_assert)`` to determine if support for compile-time
 assertions using ``static_assert`` is enabled.
 
+C++11 ``thread_local``
+^^^^^^^^^^^^^^^^^^^^^^
+
+Use ``__has_feature(cxx_thread_local)`` to determine if support for
+``thread_local`` variables is enabled.
+
 C++11 type inference
 ^^^^^^^^^^^^^^^^^^^^
 
@@ -818,6 +823,12 @@ Use ``__has_feature(c_static_assert)`` or ``__has_extension(c_static_assert)``
 to determine if support for compile-time assertions using ``_Static_assert`` is
 enabled.
 
+C11 ``_Thread_local``
+^^^^^^^^^^^^^^^^^^^^^
+
+Use ``__has_feature(c_thread_local)`` to determine if support for
+``_Thread_local`` variables is enabled.
+
 Checks for Type Traits
 ======================
 
index 21451f581f3a8058004cb0c1b5f30a9d271e0145..9a530c68018b7f0a5f31357bccaeb19feff72263 100644 (file)
@@ -751,6 +751,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", LangOpts.C11)
            // C++11 features
            .Case("cxx_access_control_sfinae", LangOpts.CPlusPlus11)
            .Case("cxx_alias_templates", LangOpts.CPlusPlus11)
@@ -768,7 +769,7 @@ static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {
            .Case("cxx_explicit_conversions", LangOpts.CPlusPlus11)
            .Case("cxx_generalized_initializers", LangOpts.CPlusPlus11)
            .Case("cxx_implicit_moves", LangOpts.CPlusPlus11)
-         //.Case("cxx_inheriting_constructors", false)
+           .Case("cxx_inheriting_constructors", LangOpts.CPlusPlus11)
            .Case("cxx_inline_namespaces", LangOpts.CPlusPlus11)
            .Case("cxx_lambdas", LangOpts.CPlusPlus11)
            .Case("cxx_local_type_template_args", LangOpts.CPlusPlus11)
@@ -782,6 +783,7 @@ static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {
            .Case("cxx_rvalue_references", LangOpts.CPlusPlus11)
            .Case("cxx_strong_enums", LangOpts.CPlusPlus11)
            .Case("cxx_static_assert", LangOpts.CPlusPlus11)
+           .Case("cxx_thread_local", LangOpts.CPlusPlus11)
            .Case("cxx_trailing_return", LangOpts.CPlusPlus11)
            .Case("cxx_unicode_literals", LangOpts.CPlusPlus11)
            .Case("cxx_unrestricted_unions", LangOpts.CPlusPlus11)
index c9a5f56ddf3a6e8579c3e1c5ed477536d2e605fe..fe2640bbda33c3d2523baef44cbee00db3674020 100644 (file)
@@ -37,6 +37,15 @@ int no_alignas();
 // CHECK-1X: has_alignas
 // CHECK-NO-1X: no_alignas
 
+#if __has_feature(c_thread_local)
+int has_thread_local();
+#else
+int no_thread_local();
+#endif
+
+// CHECK-1X: has_thread_local
+// CHECK-NO-1X: no_thread_local
+
 #if __STDC_VERSION__ > 199901L
 int is_c1x();
 #else
index 8e0222dcecd59b58395ddb0dedc7ffd49644b141..d68675afcf599f0f89cff79e51d02f3f2c174de5 100644 (file)
@@ -272,3 +272,21 @@ int no_local_type_template_args();
 
 // CHECK-0X: has_local_type_template_args
 // CHECK-NO-0X: no_local_type_template_args
+
+#if __has_feature(cxx_inheriting_constructors)
+int has_inheriting_constructors();
+#else
+int no_inheriting_constructors();
+#endif
+
+// CHECK-0X: has_inheriting_constructors
+// CHECK-NO-0X: no_inheriting_constructors
+
+#if __has_feature(cxx_thread_local)
+int has_thread_local();
+#else
+int no_thread_local();
+#endif
+
+// CHECK-0X: has_thread_local
+// CHECK-NO-0X: no_thread_local
index 715efda47e748736f551df5012ba840258656405..e37ee565ca1e0c31f8c213e5a97740026c702fde 100644 (file)
 
 <h2 id="cxx11">C++11 implementation status</h2>
 
-  <p>Clang provides support for a number of features included in the new <a href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372">ISO C++ Standard, ISO/IEC 14882:2011</a>. The following table describes which C++11 features have been implemented in Clang and in which Clang versions they became available.</p>
+  <p>Clang implements all of the <a
+    href="http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372">ISO
+    C++ 2011 standard</a>. The following table describes the Clang version
+  in which each feature became available.</p>
 
 <p>By default, Clang builds C++ code according to the C++98 standard, with many
 C++11 features accepted as extensions. You can use Clang in C++11 mode with the
@@ -47,7 +50,8 @@ patches are needed to make <a href="libstdc++4.4-clang0x.patch">libstdc++-4.4</a
 work with Clang in C++11 mode. Patches are also needed to make
 <a href="libstdc++4.6-clang11.patch">libstdc++-4.6</a>,
 and <a href="libstdc++4.7-clang11.patch">libstdc++-4.7</a> work with Clang
-releases prior to version 3.2 in C++11 mode.</p>
+releases prior to version 3.2 in C++11 mode. <tt>thread_local</tt> support
+currently requires g++-4.8's C++ runtime library.</p>
 
 <table width="689" border="1" cellspacing="0">
  <tr>
@@ -349,7 +353,7 @@ releases prior to version 3.2 in C++11 mode.</p>
     <tr>
       <td>Thread-local storage</td>
       <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm">N2659</a></td>
-      <td class="none" align="center">No</td>
+      <td class="svn" align="center">SVN</td>
     </tr>
     <tr>
       <td>Dynamic initialization and destruction with concurrency</td>
index 6455262a461a4ec344dff571445e44597044f119..23d82e3ce078736da7c8419847f42a8103e6672f 100644 (file)
@@ -94,7 +94,7 @@
    targeting X86-32, X86-64, and ARM (other targets may have caveats, but are 
    usually easy to fix).  If you are looking for source analysis or
    source-to-source transformation tools, clang is probably a great
-   solution for you.  Clang supports most of C++11, please see the <a
+   solution for you.  Clang supports C++11, please see the <a
     href="cxx_status.html">C++ status</a> page for more
    information.</p>