diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-05-30 21:23:15 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-05-30 21:23:15 +0000 |
commit | 503276be05be067a707bc7004ef3596a620072f2 (patch) | |
tree | 8bb3858a3f4893bbd9965eefaa393d57c474d8b1 /clang/lib/AST/Decl.cpp | |
parent | 4a01e59354deb1c2a40109262747dbaa34140c55 (diff) | |
download | bcm5719-llvm-503276be05be067a707bc7004ef3596a620072f2.tar.gz bcm5719-llvm-503276be05be067a707bc7004ef3596a620072f2.zip |
Fix PR16060.
The testcase in PR16060 points out that while template arguments can
show that a type is not externally visible, the standards still says
they have external linkage.
In terms of our implementation, it means that we should merge just the
isExternallyVisible bit, not the formal linkage.
llvm-svn: 182962
Diffstat (limited to 'clang/lib/AST/Decl.cpp')
-rw-r--r-- | clang/lib/AST/Decl.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 41b6da3e580..7ae7e8209d0 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -471,7 +471,9 @@ static void mergeTemplateLV(LinkageInfo &LV, // instantiation with a visibility attribute. const TemplateArgumentList &templateArgs = spec->getTemplateArgs(); LinkageInfo argsLV = getLVForTemplateArgumentList(templateArgs, computation); - LV.mergeMaybeWithVisibility(argsLV, considerVisibility); + if (considerVisibility) + LV.mergeVisibility(argsLV); + LV.mergeExternalVisibility(argsLV); } static bool useInlineVisibilityHidden(const NamedDecl *D) { @@ -863,8 +865,9 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, // Modify the variable's linkage by its type, but ignore the // type's visibility unless it's a definition. LinkageInfo typeLV = getLVForType(*VD->getType(), computation); - LV.mergeMaybeWithVisibility(typeLV, - !LV.isVisibilityExplicit() && !classLV.isVisibilityExplicit()); + if (!LV.isVisibilityExplicit() && !classLV.isVisibilityExplicit()) + LV.mergeVisibility(typeLV); + LV.mergeExternalVisibility(typeLV); if (isExplicitMemberSpecialization(VD)) { explicitSpecSuppressor = VD; |