Re-enabled support for the Subjects for the weak attribute. This changes the diagnostic involved to be more accurate -- for C++ code, it will now report that weak applies to variables, functions or classes. Added additional test case for this. llvm-svn: 196120 GitOrigin-RevId: 604dfec8dcfbbb899820022ce7bab7ad57618f8a
diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index e947b8e..c7223d6 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td
@@ -870,7 +870,7 @@ def Weak : InheritableAttr { let Spellings = [GNU<"weak">, CXX11<"gnu", "weak">]; -// let Subjects = SubjectList<[Var, Function, CXXRecord]>; + let Subjects = SubjectList<[Var, Function, CXXRecord]>; } def WeakImport : InheritableAttr {
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 9956030..20cdfdf 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td
@@ -2037,7 +2037,7 @@ "variables and fields|variables, data members and tag types|" "types and namespaces|Objective-C interfaces|methods and properties|" "struct or union|struct, union or class|types|" - "Objective-C instance methods}1">, + "Objective-C instance methods|variables, functions and classes}1">, InGroup<IgnoredAttributes>; def err_attribute_wrong_decl_type : Error< "%0 attribute only applies to %select{functions|unions|" @@ -2049,7 +2049,7 @@ "variables and fields|variables, data members and tag types|" "types and namespaces|Objective-C interfaces|methods and properties|" "struct or union|struct, union or class|types|" - "Objective-C instance methods}1">; + "Objective-C instance methods|variables, functions and classes}1">; def warn_type_attribute_wrong_type : Warning< "'%0' only applies to %select{function|pointer|" "Objective-C object or block pointer}1 types; type here is %2">,
diff --git a/include/clang/Sema/AttributeList.h b/include/clang/Sema/AttributeList.h index 690cccc..e272095 100644 --- a/include/clang/Sema/AttributeList.h +++ b/include/clang/Sema/AttributeList.h
@@ -859,7 +859,8 @@ ExpectedStructOrUnion, ExpectedStructOrUnionOrClass, ExpectedType, - ExpectedObjCInstanceMethod + ExpectedObjCInstanceMethod, + ExpectedFunctionVariableOrClass }; } // end namespace clang
diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 1ae62ef..486375a 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp
@@ -2243,24 +2243,6 @@ Attr.getAttributeSpellingListIndex())); } -static void handleWeakAttr(Sema &S, Decl *D, const AttributeList &Attr) { - if (!isa<VarDecl>(D) && !isa<FunctionDecl>(D)) { - if (isa<CXXRecordDecl>(D)) { - D->addAttr(::new (S.Context) WeakAttr(Attr.getRange(), S.Context)); - return; - } - S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) - << Attr.getName() << ExpectedVariableOrFunction; - return; - } - - NamedDecl *nd = cast<NamedDecl>(D); - - nd->addAttr(::new (S.Context) - WeakAttr(Attr.getRange(), S.Context, - Attr.getAttributeSpellingListIndex())); -} - static void handleWeakImportAttr(Sema &S, Decl *D, const AttributeList &Attr) { // weak_import only applies to variable & function declarations. bool isDef = false; @@ -4168,7 +4150,8 @@ handleSimpleAttribute<WarnUnusedAttr>(S, D, Attr); break; case AttributeList::AT_WarnUnusedResult: handleWarnUnusedResult(S, D, Attr); break; - case AttributeList::AT_Weak: handleWeakAttr (S, D, Attr); break; + case AttributeList::AT_Weak: + handleSimpleAttribute<WeakAttr>(S, D, Attr); break; case AttributeList::AT_WeakRef: handleWeakRefAttr (S, D, Attr); break; case AttributeList::AT_WeakImport: handleWeakImportAttr (S, D, Attr); break; case AttributeList::AT_TransparentUnion:
diff --git a/test/SemaCXX/attr-weak.cpp b/test/SemaCXX/attr-weak.cpp index 8939a28..2000e7f 100644 --- a/test/SemaCXX/attr-weak.cpp +++ b/test/SemaCXX/attr-weak.cpp
@@ -3,7 +3,7 @@ static int test0 __attribute__((weak)); // expected-error {{weak declaration cannot have internal linkage}} static void test1() __attribute__((weak)); // expected-error {{weak declaration cannot have internal linkage}} -namespace test2 __attribute__((weak)) { // expected-warning {{'weak' attribute only applies to variables and functions}} +namespace test2 __attribute__((weak)) { // expected-warning {{'weak' attribute only applies to variables, functions and classes}} } namespace { @@ -34,3 +34,5 @@ namespace { class Internal; } template struct Test7<Internal>; template struct Test7<int>; + +class __attribute__((weak)) Test8 {}; // OK
diff --git a/utils/TableGen/ClangAttrEmitter.cpp b/utils/TableGen/ClangAttrEmitter.cpp index 08bcb50..d459059 100644 --- a/utils/TableGen/ClangAttrEmitter.cpp +++ b/utils/TableGen/ClangAttrEmitter.cpp
@@ -1797,6 +1797,12 @@ case Func | FuncTemplate: case Func | ObjCMethod: return "ExpectedFunctionOrMethod"; case Func | Var: return "ExpectedVariableOrFunction"; + + // If not compiling for C++, the class portion does not apply. + case Func | Var | Class: + return "(S.getLangOpts().CPlusPlus ? ExpectedFunctionVariableOrClass : " + "ExpectedVariableOrFunction)"; + case ObjCMethod | ObjCProp: return "ExpectedMethodOrProperty"; case Field | Var: return "ExpectedFieldOrGlobalVar"; }