This revision was automatically updated to reflect the committed changes. Closed by commit rL247975: Fix for assertion fail for pragma weak on typedef. (authored by amusman).
Changed prior to commit: http://reviews.llvm.org/D12904?vs=34987&id=35066#toc Repository: rL LLVM http://reviews.llvm.org/D12904 Files: cfe/trunk/lib/Sema/Sema.cpp cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/CodeGen/pragma-weak.c Index: cfe/trunk/test/CodeGen/pragma-weak.c =================================================================== --- cfe/trunk/test/CodeGen/pragma-weak.c +++ cfe/trunk/test/CodeGen/pragma-weak.c @@ -53,12 +53,14 @@ #pragma weak unused // expected-warning {{weak identifier 'unused' never declared}} #pragma weak unused_alias = __unused_alias // expected-warning {{weak identifier '__unused_alias' never declared}} -#pragma weak td // expected-warning {{weak identifier 'td' never declared}} +#pragma weak td // expected-warning {{'weak' attribute only applies to variables and functions}} typedef int td; -#pragma weak td2 = __td2 // expected-warning {{weak identifier '__td2' never declared}} +#pragma weak td2 = __td2 // expected-warning {{'weak' attribute only applies to variables and functions}} typedef int __td2; +typedef int __td3; +#pragma weak td3 = __td3 // expected-warning {{'weak' attribute only applies to variables and functions}} ///// test weird cases Index: cfe/trunk/lib/Sema/SemaDecl.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp +++ cfe/trunk/lib/Sema/SemaDecl.cpp @@ -14530,7 +14530,7 @@ LookupOrdinaryName); WeakInfo W = WeakInfo(Name, NameLoc); - if (PrevDecl) { + if (PrevDecl && (isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl))) { if (!PrevDecl->hasAttr<AliasAttr>()) if (NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl)) DeclApplyPragmaWeak(TUScope, ND, W); Index: cfe/trunk/lib/Sema/Sema.cpp =================================================================== --- cfe/trunk/lib/Sema/Sema.cpp +++ cfe/trunk/lib/Sema/Sema.cpp @@ -727,8 +727,15 @@ if (WeakID.second.getUsed()) continue; - Diag(WeakID.second.getLocation(), diag::warn_weak_identifier_undeclared) - << WeakID.first; + Decl *PrevDecl = LookupSingleName(TUScope, WeakID.first, SourceLocation(), + LookupOrdinaryName); + if (PrevDecl != nullptr && + !(isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl))) + Diag(WeakID.second.getLocation(), diag::warn_attribute_wrong_decl_type) + << "'weak'" << ExpectedVariableOrFunction; + else + Diag(WeakID.second.getLocation(), diag::warn_weak_identifier_undeclared) + << WeakID.first; } if (LangOpts.CPlusPlus11 &&
Index: cfe/trunk/test/CodeGen/pragma-weak.c =================================================================== --- cfe/trunk/test/CodeGen/pragma-weak.c +++ cfe/trunk/test/CodeGen/pragma-weak.c @@ -53,12 +53,14 @@ #pragma weak unused // expected-warning {{weak identifier 'unused' never declared}} #pragma weak unused_alias = __unused_alias // expected-warning {{weak identifier '__unused_alias' never declared}} -#pragma weak td // expected-warning {{weak identifier 'td' never declared}} +#pragma weak td // expected-warning {{'weak' attribute only applies to variables and functions}} typedef int td; -#pragma weak td2 = __td2 // expected-warning {{weak identifier '__td2' never declared}} +#pragma weak td2 = __td2 // expected-warning {{'weak' attribute only applies to variables and functions}} typedef int __td2; +typedef int __td3; +#pragma weak td3 = __td3 // expected-warning {{'weak' attribute only applies to variables and functions}} ///// test weird cases Index: cfe/trunk/lib/Sema/SemaDecl.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp +++ cfe/trunk/lib/Sema/SemaDecl.cpp @@ -14530,7 +14530,7 @@ LookupOrdinaryName); WeakInfo W = WeakInfo(Name, NameLoc); - if (PrevDecl) { + if (PrevDecl && (isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl))) { if (!PrevDecl->hasAttr<AliasAttr>()) if (NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl)) DeclApplyPragmaWeak(TUScope, ND, W); Index: cfe/trunk/lib/Sema/Sema.cpp =================================================================== --- cfe/trunk/lib/Sema/Sema.cpp +++ cfe/trunk/lib/Sema/Sema.cpp @@ -727,8 +727,15 @@ if (WeakID.second.getUsed()) continue; - Diag(WeakID.second.getLocation(), diag::warn_weak_identifier_undeclared) - << WeakID.first; + Decl *PrevDecl = LookupSingleName(TUScope, WeakID.first, SourceLocation(), + LookupOrdinaryName); + if (PrevDecl != nullptr && + !(isa<FunctionDecl>(PrevDecl) || isa<VarDecl>(PrevDecl))) + Diag(WeakID.second.getLocation(), diag::warn_attribute_wrong_decl_type) + << "'weak'" << ExpectedVariableOrFunction; + else + Diag(WeakID.second.getLocation(), diag::warn_weak_identifier_undeclared) + << WeakID.first; } if (LangOpts.CPlusPlus11 &&
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits