From db77c4ae130fb72fd1a9007a50178be725bac577 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 26 Feb 2013 19:13:56 +0000 Subject: Be more careful in applying pragma weak. Fixes pr14974. GCC applies a pragma weak to a decl if it matches the mangled name. We used to apply if it matched the plain name. This patch is a compromise: we apply the pragma only if it matches the name and the decl has C language linkage. llvm-svn: 176110 --- clang/lib/Sema/SemaDeclAttr.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'clang/lib') diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index d7f423fd32d..25202b1b3c7 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -19,6 +19,7 @@ #include "clang/AST/DeclObjC.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/Expr.h" +#include "clang/AST/Mangle.h" #include "clang/Basic/CharInfo.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/TargetInfo.h" @@ -5096,11 +5097,18 @@ void Sema::ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD, if (Inheritable) { LoadExternalWeakUndeclaredIdentifiers(); if (!WeakUndeclaredIdentifiers.empty()) { - if (NamedDecl *ND = dyn_cast(D)) { + NamedDecl *ND = NULL; + if (VarDecl *VD = dyn_cast(D)) + if (VD->isExternC()) + ND = VD; + if (FunctionDecl *FD = dyn_cast(D)) + if (FD->isExternC()) + ND = FD; + if (ND) { if (IdentifierInfo *Id = ND->getIdentifier()) { llvm::DenseMap::iterator I = WeakUndeclaredIdentifiers.find(Id); - if (I != WeakUndeclaredIdentifiers.end() && ND->hasLinkage()) { + if (I != WeakUndeclaredIdentifiers.end()) { WeakInfo W = I->second; DeclApplyPragmaWeak(S, ND, W); WeakUndeclaredIdentifiers[Id] = W; -- cgit v1.2.3