]> granicus.if.org Git - clang/commitdiff
rework processing of unavailable and deprecated attributes to avoid
authorChris Lattner <sabre@nondot.org>
Thu, 24 Feb 2011 05:42:24 +0000 (05:42 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 24 Feb 2011 05:42:24 +0000 (05:42 +0000)
unneeded allocation of an empty StringLiteral when these don't have
a message.

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

lib/Sema/SemaDeclAttr.cpp

index cbc940f2f0ac4c1ed543c3b004b328881574c486..bef1bb451f028c337e4dc568f5be7c6551085f4d 100644 (file)
@@ -1014,54 +1014,48 @@ static void HandleDestructorAttr(Decl *d, const AttributeList &Attr, Sema &S) {
 }
 
 static void HandleDeprecatedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
-  // check the attribute arguments.
-  int noArgs = Attr.getNumArgs();
-  if (noArgs > 1) {
+  unsigned NumArgs = Attr.getNumArgs();
+  if (NumArgs > 1) {
     S.Diag(Attr.getLoc(), 
            diag::err_attribute_wrong_number_arguments) << "0 or 1";
     return;
   }
+  
   // Handle the case where deprecated attribute has a text message.
-  StringLiteral *SE;
-  if (noArgs == 1) {
-    Expr *ArgExpr = Attr.getArg(0);
-    SE = dyn_cast<StringLiteral>(ArgExpr);
+  llvm::StringRef Str;
+  if (NumArgs == 1) {
+    StringLiteral *SE = dyn_cast<StringLiteral>(Attr.getArg(0));
     if (!SE) {
-      S.Diag(ArgExpr->getLocStart(), 
-             diag::err_attribute_not_string) << "deprecated";
+      S.Diag(Attr.getArg(0)->getLocStart(), diag::err_attribute_not_string)
+        << "deprecated";
       return;
     }
+    Str = SE->getString();
   }
-  else
-    SE = StringLiteral::CreateEmpty(S.Context, 1);
 
-  d->addAttr(::new (S.Context) DeprecatedAttr(Attr.getLoc(), S.Context,
-                                              SE->getString()));
+  d->addAttr(::new (S.Context) DeprecatedAttr(Attr.getLoc(), S.Context, Str));
 }
 
 static void HandleUnavailableAttr(Decl *d, const AttributeList &Attr, Sema &S) {
-  // check the attribute arguments.
-  int noArgs = Attr.getNumArgs();
-  if (noArgs > 1) {
+  unsigned NumArgs = Attr.getNumArgs();
+  if (NumArgs > 1) {
     S.Diag(Attr.getLoc(),
            diag::err_attribute_wrong_number_arguments) << "0 or 1";
     return;
   }
+  
   // Handle the case where unavailable attribute has a text message.
-  StringLiteral *SE;
-  if (noArgs == 1) {
-    Expr *ArgExpr = Attr.getArg(0);
-    SE = dyn_cast<StringLiteral>(ArgExpr);
+  llvm::StringRef Str;
+  if (NumArgs == 1) {
+    StringLiteral *SE = dyn_cast<StringLiteral>(Attr.getArg(0));
     if (!SE) {
-      S.Diag(ArgExpr->getLocStart(), 
+      S.Diag(Attr.getArg(0)->getLocStart(), 
              diag::err_attribute_not_string) << "unavailable";
       return;
     }
+    Str = SE->getString();
   }
-  else
-    SE = StringLiteral::CreateEmpty(S.Context, 1);
-  d->addAttr(::new (S.Context) UnavailableAttr(Attr.getLoc(), S.Context,
-                                               SE->getString()));
+  d->addAttr(::new (S.Context) UnavailableAttr(Attr.getLoc(), S.Context, Str));
 }
 
 static void HandleVisibilityAttr(Decl *d, const AttributeList &Attr, Sema &S) {