From 7c2d0241bcc214ce9931d2ca51a3122872897a5b Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sun, 8 Dec 2013 01:13:22 +0000 Subject: [PATCH] Fix pr18174. Clang outputs LLVM one top level decl at a time. This combined with the visibility computation code looking for the newest NamespaceDecl would cause it to produce different results for nested namespaces. The two options for producing consistent results are * Delay codegen of anything inside a namespace until the end of the file. * Don't look for the newest NamespaceDecl. This patch implements the second option. This matches the gcc behavior too. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196712 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/Decl.cpp | 2 +- test/CodeGenCXX/visibility.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index c75cf20eb3..83f2c53a7c 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -976,7 +976,7 @@ getExplicitVisibilityAux(const NamedDecl *ND, kind); // Use the most recent declaration. - if (!IsMostRecent) { + if (!IsMostRecent && !isa(ND)) { const NamedDecl *MostRecent = ND->getMostRecentDecl(); if (MostRecent != ND) return getExplicitVisibilityAux(MostRecent, kind, true); diff --git a/test/CodeGenCXX/visibility.cpp b/test/CodeGenCXX/visibility.cpp index 6049bf8d2b..1c4d5bb8e7 100644 --- a/test/CodeGenCXX/visibility.cpp +++ b/test/CodeGenCXX/visibility.cpp @@ -1295,3 +1295,17 @@ namespace test68 { } // Check lines at top of file. } + +namespace test69 { + // PR18174 + namespace foo { + void f(); + } + namespace foo { + void f() {}; + } + namespace foo __attribute__((visibility("hidden"))) { + } + // CHECK-LABEL: define void @_ZN6test693foo1fEv + // CHECK-HIDDEN-LABEL: define hidden void @_ZN6test693foo1fEv +} -- 2.40.0