summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2010-06-02 15:58:27 +0000
committerAnders Carlsson <andersca@mac.com>2010-06-02 15:58:27 +0000
commitb4d2cdbb46edbaeef6f34971db937c0f8644afb7 (patch)
tree564037725380ca57abcb55dff9cd8354393ed1d8 /clang
parent6d3bc0898ee4b0aaaf81db4f94a14490954de0e7 (diff)
downloadbcm5719-llvm-b4d2cdbb46edbaeef6f34971db937c0f8644afb7.tar.gz
bcm5719-llvm-b4d2cdbb46edbaeef6f34971db937c0f8644afb7.zip
Don't substitute 'St' for 'std' when the namespace is nested inside another namespace.
llvm-svn: 105330
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/Mangle.cpp18
-rw-r--r--clang/test/CodeGenCXX/mangle-subst-std.cpp10
2 files changed, 19 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp
index b7d8e2704a4..c246bb50c69 100644
--- a/clang/lib/CodeGen/Mangle.cpp
+++ b/clang/lib/CodeGen/Mangle.cpp
@@ -362,12 +362,6 @@ void CXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) {
mangleBareFunctionType(FT, MangleReturnType);
}
-/// isStd - Return whether a given namespace is the 'std' namespace.
-static bool isStd(const NamespaceDecl *NS) {
- const IdentifierInfo *II = NS->getOriginalNamespace()->getIdentifier();
- return II && II->isStr("std");
-}
-
static const DeclContext *IgnoreLinkageSpecDecls(const DeclContext *DC) {
while (isa<LinkageSpecDecl>(DC)) {
DC = DC->getParent();
@@ -376,15 +370,21 @@ static const DeclContext *IgnoreLinkageSpecDecls(const DeclContext *DC) {
return DC;
}
+/// isStd - Return whether a given namespace is the 'std' namespace.
+static bool isStd(const NamespaceDecl *NS) {
+ if (!IgnoreLinkageSpecDecls(NS->getParent())->isTranslationUnit())
+ return false;
+
+ const IdentifierInfo *II = NS->getOriginalNamespace()->getIdentifier();
+ return II && II->isStr("std");
+}
+
// isStdNamespace - Return whether a given decl context is a toplevel 'std'
// namespace.
static bool isStdNamespace(const DeclContext *DC) {
if (!DC->isNamespace())
return false;
- if (!IgnoreLinkageSpecDecls(DC->getParent())->isTranslationUnit())
- return false;
-
return isStd(cast<NamespaceDecl>(DC));
}
diff --git a/clang/test/CodeGenCXX/mangle-subst-std.cpp b/clang/test/CodeGenCXX/mangle-subst-std.cpp
index 4c15eaac883..9c1e978294c 100644
--- a/clang/test/CodeGenCXX/mangle-subst-std.cpp
+++ b/clang/test/CodeGenCXX/mangle-subst-std.cpp
@@ -99,3 +99,13 @@ void f(not_string) { }
void create_streams() {
std::basic_iostream<char> bio(17);
}
+
+// Make sure we don't mangle 'std' as 'St' here.
+namespace N {
+ namespace std {
+ struct A { void f(); };
+
+ // CHECK: define void @_ZN1N3std1A1fEv
+ void A::f() { }
+ }
+}
OpenPOWER on IntegriCloud