teak-llvm/clang/test/Parser/cxx1z-nested-namespace-definition.cpp
Richard Smith 13307f5f24 [c++1z] Implement nested-namespace-definitions.
This allows 'namespace A::B { ... }' as a shorthand for 'namespace A {
namespace B { ... } }'. We already supported this correctly for error recovery;
promote that support to a full implementation.

This is not the right implementation: we do not maintain source fidelity
because we desugar the nested namespace definition in the parser. This is
tricky to avoid, since the definition genuinely does inject one named
entity per level in the namespace name.

llvm-svn: 221574
2014-11-08 05:37:34 +00:00

39 lines
945 B
C++

// RUN: cp %s %t
// RUN: %clang_cc1 -fsyntax-only -verify %s
// RUN: not %clang_cc1 -x c++ -fixit %t -Werror -DFIXIT
// RUN: %clang_cc1 -x c++ %t -DFIXIT
// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++1z -Wc++14-compat
namespace foo1::foo2::foo3 {
#if __cplusplus <= 201400L
// expected-warning@-2 {{nested namespace definition is a C++1z extension; define each namespace separately}}
#else
// expected-warning@-4 {{nested namespace definition is incompatible with C++ standards before C++1z}}
#endif
int foo(int x) { return x; }
}
#ifndef FIXIT
inline namespace goo::bar { // expected-error {{nested namespace definition cannot be 'inline'}} expected-warning 0-1{{C++11 feature}}
int n;
}
int m = goo::bar::n;
#endif
int foo(int x) {
return foo1::foo2::foo3::foo(x);
}
namespace bar1 {
namespace bar2 {
namespace bar3 {
int bar(int x) { return x; }
}
}
}
int bar(int x) {
return bar1::bar2::bar3::bar(x);
}