]> granicus.if.org Git - clang/commitdiff
Attributes accepting an EnumArgument are allowed to pass a string literal, or an...
authorAaron Ballman <aaron@aaronballman.com>
Fri, 19 Dec 2014 16:42:04 +0000 (16:42 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Fri, 19 Dec 2014 16:42:04 +0000 (16:42 +0000)
This change affects the only attribute accepting a variadic enumeration: callable_when.

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

lib/Sema/SemaDeclAttr.cpp
test/SemaCXX/warn-consumed-parsing.cpp
utils/TableGen/ClangAttrEmitter.cpp

index 6248f6c78befabcededbf2c7b86be194bd716aa8..f1f369401cdd8a7769475c8bfed206147e58ac3f 100644 (file)
@@ -863,8 +863,14 @@ static void handleCallableWhenAttr(Sema &S, Decl *D,
     
     StringRef StateString;
     SourceLocation Loc;
-    if (!S.checkStringLiteralArgumentAttr(Attr, ArgIndex, StateString, &Loc))
-      return;
+    if (Attr.isArgIdent(ArgIndex)) {
+      IdentifierLoc *Ident = Attr.getArgAsIdent(ArgIndex);
+      StateString = Ident->Ident->getName();
+      Loc = Ident->Loc;
+    } else {
+      if (!S.checkStringLiteralArgumentAttr(Attr, ArgIndex, StateString, &Loc))
+        return;
+    }
 
     if (!CallableWhenAttr::ConvertStrToConsumedState(StateString,
                                                      CallableState)) {
index 5c0a04fffe36eebe58353ae87ff3f2835f151f81..179604141b7b26cd649442891bb654b25ef361a5 100644 (file)
@@ -37,6 +37,7 @@ class CONSUMABLE(unknown) AttrTester1 {
   void callableWhen0()  CALLABLE_WHEN("unconsumed");
   void callableWhen1()  CALLABLE_WHEN(42); // expected-error {{'callable_when' attribute requires a string}}
   void callableWhen2()  CALLABLE_WHEN("foo"); // expected-warning {{'callable_when' attribute argument not supported: foo}}
+  void callableWhen3()  CALLABLE_WHEN(unconsumed);
   void consumes()       SET_TYPESTATE(consumed);
   bool testUnconsumed() TEST_TYPESTATE(consumed);
 };
index 67f9452ba607a36dfea01e4de9649705e267c8ce..4103a39e70a585a4460d293a6faeb07c88524d0e 100644 (file)
@@ -1387,6 +1387,7 @@ static bool isIdentifierArgument(Record *Arg) {
     llvm::StringSwitch<bool>(Arg->getSuperClasses().back()->getName())
     .Case("IdentifierArgument", true)
     .Case("EnumArgument", true)
+    .Case("VariadicEnumArgument", true)
     .Default(false);
 }