зеркало из https://github.com/microsoft/clang-1.git
llvm-gcc treats a tentative definition with a previous
(or follow up) extern declaration with weak_import as an actual definition. make clang follows this behavior. // rdar://9538608 llvm-gcc treats an extern declaration with weak_import git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133450 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
6fe6bac2ad
Коммит
ab27d6ea7b
|
@ -1351,7 +1351,8 @@ CodeGenModule::GetLLVMLinkageVarDefinition(const VarDecl *D,
|
|||
((!CodeGenOpts.NoCommon && !D->getAttr<NoCommonAttr>()) ||
|
||||
D->getAttr<CommonAttr>()) &&
|
||||
!D->hasExternalStorage() && !D->getInit() &&
|
||||
!D->getAttr<SectionAttr>() && !D->isThreadSpecified()) {
|
||||
!D->getAttr<SectionAttr>() && !D->isThreadSpecified() &&
|
||||
!D->getAttr<WeakImportAttr>()) {
|
||||
// Thread local vars aren't considered common linkage.
|
||||
return llvm::GlobalVariable::CommonLinkage;
|
||||
}
|
||||
|
|
|
@ -2039,6 +2039,12 @@ void Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {
|
|||
}
|
||||
|
||||
mergeDeclAttributes(New, Old, Context);
|
||||
// weak_import on current declaration is applied to previous
|
||||
// tentative definiton.
|
||||
if (New->getAttr<WeakImportAttr>() &&
|
||||
Old->getStorageClass() == SC_None &&
|
||||
!Old->getAttr<WeakImportAttr>())
|
||||
Old->addAttr(::new (Context) WeakImportAttr(SourceLocation(), Context));
|
||||
|
||||
// Merge the types.
|
||||
MergeVarDeclTypes(New, Old);
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-darwin-apple -emit-llvm -o - %s | FileCheck %s
|
||||
// rdar://9538608
|
||||
|
||||
extern int A __attribute__((weak_import));
|
||||
int A;
|
||||
|
||||
extern int B __attribute__((weak_import));
|
||||
extern int B;
|
||||
|
||||
int C;
|
||||
extern int C __attribute__((weak_import));
|
||||
|
||||
extern int D __attribute__((weak_import));
|
||||
extern int D __attribute__((weak_import));
|
||||
int D;
|
||||
|
||||
extern int E __attribute__((weak_import));
|
||||
int E;
|
||||
extern int E __attribute__((weak_import));
|
||||
|
||||
// CHECK: @A = global i32
|
||||
// CHECK-NOT: @B =
|
||||
// CHECK: @C = global i32
|
||||
// CHECK: @D = global i32
|
||||
// CHECK: @E = global i32
|
||||
|
Загрузка…
Ссылка в новой задаче