summaryrefslogtreecommitdiffstats
path: root/clang/test/CXX
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/CXX')
-rw-r--r--clang/test/CXX/basic/basic.link/p7.cpp73
-rw-r--r--clang/test/CXX/dcl.decl/dcl.meaning/dcl.array/p3.cpp65
-rw-r--r--clang/test/CXX/drs/dr0xx.cpp17
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();
OpenPOWER on IntegriCloud