]> granicus.if.org Git - clang/commitdiff
Accept __has_feature(__feature__) as a synonym for __has_feature(feature) (and
authorRichard Smith <richard-llvm@metafoo.co.uk>
Sat, 25 Feb 2012 10:41:10 +0000 (10:41 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Sat, 25 Feb 2012 10:41:10 +0000 (10:41 +0000)
likewise for __has_extension). Patch by Jonathan Sauer!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151445 91177308-0d34-0410-b5e6-96231b3b80d8

docs/LanguageExtensions.html
lib/Lex/PPMacroExpansion.cpp
lib/Sema/AttributeList.cpp
test/Lexer/has_extension.c
test/Preprocessor/feature_tests.c

index 2471c60776c1d975e0e848df01487dca7b509f69..cdd197956fe0363d0a043a454983903492f4df61 100644 (file)
@@ -228,6 +228,11 @@ not related to the language standard, such as e.g.
 
 <p>The feature tag is described along with the language feature below.</p>
 
+<p>The feature name or extension name can also be specified with a preceding and
+following <code>__</code> (double underscore) to avoid interference from a macro
+with the same name. For instance, <code>__always_inline__</code> can be used
+instead of <code>always_inline</code>.</p>
+
 <!-- ======================================================================= -->
 <h3><a name="__has_attribute">__has_attribute</a></h3>
 <!-- ======================================================================= -->
index bc346927027ee2f3b7c6f29d37d8cb45874fcdfe..c7c8e00f4096173ecb5fc0b5bde80f69daaa5d64 100644 (file)
@@ -589,8 +589,13 @@ static void ComputeDATE_TIME(SourceLocation &DATELoc, SourceLocation &TIMELoc,
 /// specified by the identifier as a standard language feature.
 static bool HasFeature(const Preprocessor &PP, const IdentifierInfo *II) {
   const LangOptions &LangOpts = PP.getLangOptions();
+  StringRef Feature = II->getName();
 
-  return llvm::StringSwitch<bool>(II->getName())
+  // Normalize the feature name, __foo__ becomes foo.
+  if (Feature.startswith("__") && Feature.endswith("__") && Feature.size() >= 4)
+    Feature = Feature.substr(2, Feature.size() - 4);
+
+  return llvm::StringSwitch<bool>(Feature)
            .Case("address_sanitizer", LangOpts.AddressSanitizer)
            .Case("attribute_analyzer_noreturn", true)
            .Case("attribute_availability", true)
@@ -724,10 +729,16 @@ static bool HasExtension(const Preprocessor &PP, const IdentifierInfo *II) {
     return false;
 
   const LangOptions &LangOpts = PP.getLangOptions();
+  StringRef Extension = II->getName();
+
+  // Normalize the extension name, __foo__ becomes foo.
+  if (Extension.startswith("__") && Extension.endswith("__") &&
+      Extension.size() >= 4)
+    Extension = Extension.substr(2, Extension.size() - 4);
 
   // Because we inherit the feature list from HasFeature, this string switch
   // must be less restrictive than HasFeature's.
-  return llvm::StringSwitch<bool>(II->getName())
+  return llvm::StringSwitch<bool>(Extension)
            // C11 features supported by other languages as extensions.
            .Case("c_alignas", true)
            .Case("c_atomic", true)
index a3791dedf73b664cc1c32e9f73289bdb93ec6df4..9b74fc03cefdeb99922d3ac4d112695e5c382e23 100644 (file)
@@ -101,7 +101,8 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
   StringRef AttrName = Name->getName();
 
   // Normalize the attribute name, __foo__ becomes foo.
-  if (AttrName.startswith("__") && AttrName.endswith("__"))
+  if (AttrName.startswith("__") && AttrName.endswith("__") &&
+      AttrName.size() >= 4)
     AttrName = AttrName.substr(2, AttrName.size() - 4);
 
   return llvm::StringSwitch<AttributeList::Kind>(AttrName)
index 4c322c7ce7a3b320861af588eb3490da379fc153..3b08510aa4402184a7c7774e552f7a0fc7e3653f 100644 (file)
@@ -36,3 +36,9 @@ int has_c_alignas();
 int no_c_alignas();
 #endif
 
+// Arbitrary feature to test that the extension name can be surrounded with
+// double underscores.
+// CHECK-PED-NONE: has_double_underscores
+#if __has_extension(__c_alignas__)
+int has_double_underscores();
+#endif
index 35592bd8e1c3ea21847c4a84f7f249cc19c7dace..be9c62d780849afe8527713da3a74dea6ef3841b 100644 (file)
@@ -21,7 +21,9 @@
 #error Clang should not have this
 #endif
 
-
+#if !__has_feature(__attribute_deprecated_with_message__)
+#error Feature name in double underscores does not work
+#endif
 
 // Make sure we have x86 builtins only (forced with target triple).