diff options
Diffstat (limited to 'clang/test/CXX')
-rw-r--r-- | clang/test/CXX/basic/basic.link/p7.cpp | 73 | ||||
-rw-r--r-- | clang/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp | 65 | ||||
-rw-r--r-- | clang/test/CXX/drs/dr0xx.cpp | 17 |
3 files changed, 141 insertions, 14 deletions
diff --git a/clang/test/CXX/basic/basic.link/p7.cpp b/clang/test/CXX/basic/basic.link/p7.cpp new file mode 100644 index 00000000000..9a85eacdda4 --- /dev/null +++ b/clang/test/CXX/basic/basic.link/p7.cpp @@ -0,0 +1,73 @@ +// RUN: %clang_cc1 -verify -std=c++1y %s + +// Example from the standard. +namespace X { + void p() { + q(); // expected-error {{undeclared}} + extern void q(); + } + void middle() { + q(); // expected-error {{undeclared}} + } + void q() { /*...*/ } + void bottom() { + q(); + } +} +int q(); + +namespace Test1 { + void f() { + extern int a; // expected-note {{previous}} + int g(void); // expected-note {{previous}} + } + double a; // expected-error {{different type: 'double' vs 'int'}} + double g(); // expected-error {{differ only in their return type}} +} + +namespace Test2 { + void f() { + extern int a; // expected-note {{previous}} + int g(void); // expected-note {{previous}} + } + void h() { + extern double a; // expected-error {{different type: 'double' vs 'int'}} + double g(void); // expected-error {{differ only in their return type}} + } +} + +namespace Test3 { + constexpr void (*f())() { + void h(); + return &h; + } + constexpr void (*g())() { + void h(); + return &h; + } + static_assert(f() == g(), ""); +} + +namespace Test4 { + template<typename T> + constexpr void (*f())() { + void h(); + return &h; + } + static_assert(f<int>() == f<char>(), ""); + void h(); + static_assert(f<int>() == &h, ""); +} + +namespace Test5 { + constexpr auto f() -> void (*)() { + void g(); + struct X { + friend void g(); + static constexpr auto h() -> void (*)() { return g; } + }; + return X::h(); + } + void g(); + static_assert(f() == g, ""); +} diff --git a/clang/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp b/clang/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp index 2dbc143065e..e040d5b2642 100644 --- a/clang/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp +++ b/clang/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp @@ -61,6 +61,8 @@ namespace test6 { int x = sizeof(array); // expected-error {{invalid application of 'sizeof' to an incomplete type 'int []'}} } int y = sizeof(array); + extern int array[]; + int z = sizeof(array); } } @@ -71,6 +73,19 @@ namespace test7 { int x = sizeof(array); // expected-error {{invalid application of 'sizeof' to an incomplete type 'int []'}} } int y = sizeof(array); + extern int array[]; + int z = sizeof(array); +} + +namespace test8 { + extern int array[]; + void test() { + extern int array[100]; + int x = sizeof(array); + } + int y = sizeof(array); // expected-error {{invalid application of 'sizeof' to an incomplete type 'int []'}} + extern int array[]; + int z = sizeof(array); // expected-error {{invalid application of 'sizeof' to an incomplete type 'int []'}} } namespace dependent { @@ -143,10 +158,52 @@ namespace dependent { } template<typename T> void n() { - extern T n_var; + extern T n_var; // expected-error {{redefinition of 'n_var' with a different type: 'double' vs 'int'}} expected-note {{previous}} + extern T n_fn(); // expected-error {{functions that differ only in their return type cannot be overloaded}} expected-note {{previous}} } template void n<int>(); - // FIXME: Diagnose this! - float n_var; - template void n<double>(); + template void n<double>(); // expected-note {{in instantiation of}} + + template<typename T> void o() { + extern T o_var; // expected-note {{previous}} + extern T o_fn(); // expected-note {{previous}} + } + template void o<int>(); + float o_var; // expected-error {{redefinition of 'o_var' with a different type: 'float' vs 'int'}} + float o_fn(); // expected-error {{functions that differ only in their return type cannot be overloaded}} + + int p_var; + int p_fn(); + template<typename T> void p() { + extern T p_var; + extern T p_fn(); + } +} + +namespace use_outside_ns { + namespace A { + extern int a[3]; + extern int b[]; + extern int c[3]; + void f() { + extern int a[]; + extern int b[3]; + } + template<typename T> void x() { + extern T c; + extern T d; + } + extern int d[3]; + template void x<int[]>(); + } + int w = sizeof(A::a); + int x = sizeof(A::b); // expected-error {{incomplete}} + int y = sizeof(A::c); + int z = sizeof(A::d); + namespace A { + int g() { return sizeof(a); } + int h() { return sizeof(b); } // expected-error {{incomplete}} + int i() { return sizeof(c); } + int j() { return sizeof(d); } + } } diff --git a/clang/test/CXX/drs/dr0xx.cpp b/clang/test/CXX/drs/dr0xx.cpp index f8ac57f13fd..70a9e491942 100644 --- a/clang/test/CXX/drs/dr0xx.cpp +++ b/clang/test/CXX/drs/dr0xx.cpp @@ -280,7 +280,7 @@ namespace dr27 { // dr27: yes // dr28: na -namespace dr29 { // dr29: no +namespace dr29 { // dr29: 3.4 void dr29_f0(); // expected-note {{here}} void g0() { void dr29_f0(); } extern "C++" void g0_cxx() { void dr29_f0(); } @@ -291,17 +291,14 @@ namespace dr29 { // dr29: no extern "C" void g1_c() { void dr29_f1(); } extern "C++" void g1_cxx() { void dr29_f1(); } // expected-error {{different language linkage}} - // FIXME: We should reject this. - void g2() { void dr29_f2(); } - extern "C" void dr29_f2(); + void g2() { void dr29_f2(); } // expected-note {{here}} + extern "C" void dr29_f2(); // expected-error {{different language linkage}} - // FIXME: We should reject this. - extern "C" void g3() { void dr29_f3(); } - extern "C++" void dr29_f3(); + extern "C" void g3() { void dr29_f3(); } // expected-note {{here}} + extern "C++" void dr29_f3(); // expected-error {{different language linkage}} - // FIXME: We should reject this. - extern "C++" void g4() { void dr29_f4(); } - extern "C" void dr29_f4(); + extern "C++" void g4() { void dr29_f4(); } // expected-note {{here}} + extern "C" void dr29_f4(); // expected-error {{different language linkage}} extern "C" void g5(); extern "C++" void dr29_f5(); |