]> granicus.if.org Git - clang/commitdiff
The operand to the visibility attribute is required to be a quoted string, not a...
authorChris Lattner <sabre@nondot.org>
Tue, 4 Mar 2008 18:08:48 +0000 (18:08 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 4 Mar 2008 18:08:48 +0000 (18:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47893 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaDecl.cpp
test/CodeGen/attributes.c

index 88225f535d4ccd99c59996039a11c6fc6bb373dc..3b63a8056614c90fe77c2481402a47e262f60aeb 100644 (file)
@@ -2022,32 +2022,37 @@ void Sema::HandleDeprecatedAttribute(Decl *d, AttributeList *rawAttr) {
 
 void Sema::HandleVisibilityAttribute(Decl *d, AttributeList *rawAttr) {
   // check the attribute arguments.
-  if (rawAttr->getNumArgs() != 0) {
+  if (rawAttr->getNumArgs() != 1) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
          std::string("1"));
     return;
   }
 
-  if (!rawAttr->getParameterName()) {
+  Expr *Arg = static_cast<Expr*>(rawAttr->getArg(0));
+  Arg = Arg->IgnoreParenCasts();
+  StringLiteral *Str = dyn_cast<StringLiteral>(Arg);
+  
+  if (Str == 0 || Str->isWide()) {
     Diag(rawAttr->getLoc(), diag::err_attribute_argument_n_not_string,
-           "visibility", std::string("1"));
+         "visibility", std::string("1"));
     return;
   }
 
-  const char *typeStr = rawAttr->getParameterName()->getName();
+  const char *TypeStr = Str->getStrData();
+  unsigned TypeLen = Str->getByteLength();
   llvm::GlobalValue::VisibilityTypes type;
 
-  if (!memcmp(typeStr, "default", 7))
+  if (TypeLen == 7 && !memcmp(TypeStr, "default", 7))
     type = llvm::GlobalValue::DefaultVisibility;
-  else if (!memcmp(typeStr, "hidden", 6))
+  else if (TypeLen == 6 && !memcmp(TypeStr, "hidden", 6))
     type = llvm::GlobalValue::HiddenVisibility;
-  else if (!memcmp(typeStr, "internal", 8))
+  else if (TypeLen == 8 && !memcmp(TypeStr, "internal", 8))
     type = llvm::GlobalValue::HiddenVisibility; // FIXME
-  else if (!memcmp(typeStr, "protected", 9))
+  else if (TypeLen == 9 && !memcmp(TypeStr, "protected", 9))
     type = llvm::GlobalValue::ProtectedVisibility;
   else {
     Diag(rawAttr->getLoc(), diag::warn_attribute_type_not_supported,
-           "visibility", typeStr);
+           "visibility", TypeStr);
     return;
   }
 
index 3533d6d84324a04e8f9d7ab81d7423b2c4cf1859..a310a3ab6441dcc21b6725b9fdec257eb0f03101 100644 (file)
@@ -11,14 +11,14 @@ void t3() __attribute__((weak));
 void t3() {}
 
 // RUN: clang -emit-llvm < %s | grep 'hidden.*t4'
-void t4() __attribute__((visibility(hidden)));
+void t4() __attribute__((visibility("hidden")));
 void t4() {}
 
 // RUN: clang -emit-llvm < %s | grep 't5.*weak'
 int t5 __attribute__((weak)) = 2;
 
 // RUN: clang -emit-llvm < %s | grep 't6.*protected'
-int t6 __attribute__((visibility(protected)));
+int t6 __attribute__((visibility("protected")));
 
 // RUN: clang -emit-llvm < %s | grep 't7.*noreturn'
 // RUN: clang -emit-llvm < %s | grep 't7.*nounwind'