diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/Decl.cpp | 2 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/linkage.cpp | 16 |
2 files changed, 17 insertions, 1 deletions
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 5e0ffdacf09..4f98ff34b4b 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -1070,7 +1070,7 @@ static LinkageInfo getLVForLocalDecl(const NamedDecl *D, if (!FD || !FD->isInlined()) return LinkageInfo::none(); LinkageInfo LV = FD->getLinkageAndVisibility(); - if (LV.getLinkage() != ExternalLinkage) + if (!isExternallyVisible(LV.getLinkage())) return LinkageInfo::none(); return LinkageInfo(VisibleNoLinkage, LV.getVisibility(), LV.isVisibilityExplicit()); diff --git a/clang/test/CodeGenCXX/linkage.cpp b/clang/test/CodeGenCXX/linkage.cpp index c803a941614..9d66934a243 100644 --- a/clang/test/CodeGenCXX/linkage.cpp +++ b/clang/test/CodeGenCXX/linkage.cpp @@ -143,3 +143,19 @@ namespace test11 { } void *h() { return g(); } } + +namespace test12 { + // CHECK-DAG: define linkonce_odr void @_ZN6test123fooIZNS_3barIZNS_3zedEvE2S2EEPvvE2S1EEvv + template <typename T> void foo() {} + template <typename T> inline void *bar() { + enum S1 { + }; + return reinterpret_cast<void *>(foo<S1>); + } + inline void *zed() { + enum S2 { + }; + return reinterpret_cast<void *>(bar<S2>); + } + void *h() { return zed(); } +} |