diff options
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 13 | ||||
-rw-r--r-- | test/SemaCXX/auto-pragma.cpp | 12 |
2 files changed, 19 insertions, 6 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index f062c0386d..20c1b1015e 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -4908,11 +4908,6 @@ Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, !NewVD->isInvalidDecl()) RegisterLocallyScopedExternCDecl(NewVD, Previous, S); - // If there's a #pragma GCC visibility in scope, and this isn't a class - // member, set the visibility of this variable. - if (NewVD->getLinkage() == ExternalLinkage && !DC->isRecord()) - AddPushedVisibilityAttribute(NewVD); - return NewVD; } @@ -7880,10 +7875,16 @@ Sema::FinalizeDeclaration(Decl *ThisDecl) { // Note that we are no longer parsing the initializer for this declaration. ParsingInitForAutoVars.erase(ThisDecl); - const VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl); + VarDecl *VD = dyn_cast_or_null<VarDecl>(ThisDecl); if (!VD) return; + const DeclContext *DC = VD->getDeclContext(); + // If there's a #pragma GCC visibility in scope, and this isn't a class + // member, set the visibility of this variable. + if (VD->getLinkage() == ExternalLinkage && !DC->isRecord()) + AddPushedVisibilityAttribute(VD); + if (VD->isFileVarDecl()) MarkUnusedFileScopedDecl(VD); diff --git a/test/SemaCXX/auto-pragma.cpp b/test/SemaCXX/auto-pragma.cpp new file mode 100644 index 0000000000..1cd0781fe9 --- /dev/null +++ b/test/SemaCXX/auto-pragma.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -ast-dump -ast-dump-filter AutoVar | FileCheck %s + +namespace { + class foo { + }; +} + +#pragma GCC visibility push(hidden) +auto AutoVar = foo(); + +// CHECK: VarDecl {{.*}} AutoVar +// CHECK-NOT: VisibilityAttr |