diff options
Diffstat (limited to 'test/SemaCXX/libstdcxx_atomic_ns_hack.cpp')
-rw-r--r-- | test/SemaCXX/libstdcxx_atomic_ns_hack.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/test/SemaCXX/libstdcxx_atomic_ns_hack.cpp b/test/SemaCXX/libstdcxx_atomic_ns_hack.cpp new file mode 100644 index 0000000..4e4523f --- /dev/null +++ b/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 |