aboutsummaryrefslogtreecommitdiff
path: root/clang/test/Parser/cxx1z-nested-namespace-definition.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2014-11-08 05:37:34 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2014-11-08 05:37:34 +0000
commit13307f5f24299d35a0bf944153bc3d673fccadf6 (patch)
tree934e824c1c7d4d979ca98fe421de8c35193d7789 /clang/test/Parser/cxx1z-nested-namespace-definition.cpp
parent0f0af19b058151690ec02d781d0039fb1fc38426 (diff)
downloadllvm-13307f5f24299d35a0bf944153bc3d673fccadf6.zip
llvm-13307f5f24299d35a0bf944153bc3d673fccadf6.tar.gz
llvm-13307f5f24299d35a0bf944153bc3d673fccadf6.tar.bz2
[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
Diffstat (limited to 'clang/test/Parser/cxx1z-nested-namespace-definition.cpp')
-rw-r--r--clang/test/Parser/cxx1z-nested-namespace-definition.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/clang/test/Parser/cxx1z-nested-namespace-definition.cpp b/clang/test/Parser/cxx1z-nested-namespace-definition.cpp
new file mode 100644
index 0000000..96f34c5
--- /dev/null
+++ b/clang/test/Parser/cxx1z-nested-namespace-definition.cpp
@@ -0,0 +1,38 @@
+// 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);
+}