summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-10-04 22:13:39 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-10-04 22:13:39 +0000
commit45bb8855e0ecca4f47e1ca310bc11e2106e226bb (patch)
treefd6600e4fd9e3731226d61fc347e12b125e87b36 /clang/test
parentac34b5c9e5fd76b04c1d718c80364c262f6d2ed6 (diff)
downloadbcm5719-llvm-45bb8855e0ecca4f47e1ca310bc11e2106e226bb.tar.gz
bcm5719-llvm-45bb8855e0ecca4f47e1ca310bc11e2106e226bb.zip
Egriegious hack to support libstdc++4.6's broken <atomic> header, which defines
a non-inline namespace, then reopens it as inline to try to add its symbols to the surrounding namespace. In this one special case, permit the namespace to be reopened as inline, and patch up the name lookup tables to match. llvm-svn: 165263
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CXX/dcl.dcl/basic.namespace/namespace.def/p7.cpp4
-rw-r--r--clang/test/SemaCXX/libstdcxx_atomic_ns_hack.cpp35
2 files changed, 37 insertions, 2 deletions
diff --git a/clang/test/CXX/dcl.dcl/basic.namespace/namespace.def/p7.cpp b/clang/test/CXX/dcl.dcl/basic.namespace/namespace.def/p7.cpp
index 98d12f99a59..f92362380a1 100644
--- a/clang/test/CXX/dcl.dcl/basic.namespace/namespace.def/p7.cpp
+++ b/clang/test/CXX/dcl.dcl/basic.namespace/namespace.def/p7.cpp
@@ -3,11 +3,11 @@
namespace NIL {} // expected-note {{previous definition}}
inline namespace NIL {} // expected-error {{cannot be reopened as inline}}
inline namespace IL {} // expected-note {{previous definition}}
-namespace IL {} // expected-warning{{inline namespace cannot be re-opened as a non-inline namespace}}
+namespace IL {} // expected-warning{{inline namespace cannot be reopened as a non-inline namespace}}
namespace {} // expected-note {{previous definition}}
inline namespace {} // expected-error {{cannot be reopened as inline}}
namespace X {
inline namespace {} // expected-note {{previous definition}}
- namespace {} // expected-error {{cannot be reopened as non-inline}}
+ namespace {} // expected-warning {{cannot be reopened as a non-inline namespace}}
}
diff --git a/clang/test/SemaCXX/libstdcxx_atomic_ns_hack.cpp b/clang/test/SemaCXX/libstdcxx_atomic_ns_hack.cpp
new file mode 100644
index 00000000000..4e4523f8532
--- /dev/null
+++ b/clang/test/SemaCXX/libstdcxx_atomic_ns_hack.cpp
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
+
+// libstdc++ 4.6.x contains a bug where it defines std::__atomic[0,1,2] as a
+// non-inline namespace, then selects one of those namespaces and reopens it
+// as inline, as a strange way of providing something like a using-directive.
+// Clang has an egregious hack to work around the problem, by allowing a
+// namespace to be converted from non-inline to inline in this one specific
+// case.
+
+#ifdef BE_THE_HEADER
+
+#pragma clang system_header
+
+namespace std {
+ namespace __atomic0 {
+ typedef int foobar;
+ }
+ namespace __atomic1 {
+ typedef void foobar;
+ }
+
+ inline namespace __atomic0 {}
+}
+
+#else
+
+#define BE_THE_HEADER
+#include "libstdcxx_atomic_ns_hack.cpp"
+
+std::foobar fb;
+
+using T = void; // expected-note {{here}}
+using T = std::foobar; // expected-error {{different types ('std::foobar' (aka 'int') vs 'void')}}
+
+#endif
OpenPOWER on IntegriCloud