summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/SemaCXX')
-rw-r--r--clang/test/SemaCXX/aggregate-initialization.cpp7
-rw-r--r--clang/test/SemaCXX/c99.cpp69
-rw-r--r--clang/test/SemaCXX/constant-expression-cxx11.cpp6
-rw-r--r--clang/test/SemaCXX/constexpr-printing.cpp6
-rw-r--r--clang/test/SemaCXX/cxx0x-initializer-constructor.cpp2
-rw-r--r--clang/test/SemaCXX/cxx2a-initializer-aggregates.cpp109
-rw-r--r--clang/test/SemaCXX/decltype.cpp10
-rw-r--r--clang/test/SemaCXX/designated-initializers-base-class.cpp3
-rw-r--r--clang/test/SemaCXX/designated-initializers.cpp4
-rw-r--r--clang/test/SemaCXX/eval-crashes.cpp2
-rw-r--r--clang/test/SemaCXX/member-init.cpp2
11 files changed, 192 insertions, 28 deletions
diff --git a/clang/test/SemaCXX/aggregate-initialization.cpp b/clang/test/SemaCXX/aggregate-initialization.cpp
index bb03c6fb5cf..c71a7449d31 100644
--- a/clang/test/SemaCXX/aggregate-initialization.cpp
+++ b/clang/test/SemaCXX/aggregate-initialization.cpp
@@ -1,6 +1,7 @@
-// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
-// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s
-// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++2a %s
// Verify that using an initializer list for a non-aggregate looks for
// constructors..
diff --git a/clang/test/SemaCXX/c99.cpp b/clang/test/SemaCXX/c99.cpp
index 7afcdd509f9..9fbc45bc203 100644
--- a/clang/test/SemaCXX/c99.cpp
+++ b/clang/test/SemaCXX/c99.cpp
@@ -1,9 +1,70 @@
-// RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
+// RUN: %clang_cc1 -fsyntax-only -pedantic -verify=expected,cxx17 -std=c++17 %s
+// RUN: %clang_cc1 -fsyntax-only -pedantic -verify=expected,cxx20 -std=c++2a %s
+
+// cxx17-warning@* 0+{{designated initializers are a C++20 extension}}
+
void f1(int i[static 5]) { // expected-error{{C99}}
}
struct Point { int x; int y; int z[]; }; // expected-warning{{flexible array members are a C99 feature}}
-Point p1 = { .x = 17, // expected-warning{{designated initializers are a C99 feature}}
- y: 25 }; // expected-warning{{designated initializers are a C99 feature}} \
- // expected-warning{{use of GNU old-style field designator extension}}
+Point p1 = { .x = 17,
+ y: 25 }; // expected-warning{{use of GNU old-style field designator extension}}
+
+Point p2 = {
+ .x = 17, // expected-warning {{mixture of designated and non-designated initializers in the same initializer list is a C99 extension}}
+ 25 // expected-note {{first non-designated initializer}}
+};
+
+Point p3 = {
+ .x = 17, // expected-note {{previous initialization is here}}
+ .x = 18, // expected-warning {{initializer overrides prior initialization of this subobject}}
+};
+
+Point p4 = {
+ .x = 17, // expected-warning {{mixture of designated and non-designated initializers in the same initializer list is a C99 extension}}
+ 25, // expected-note {{first non-designated initializer}}
+ // expected-note@-1 {{previous initialization is here}}
+ .y = 18, // expected-warning {{initializer overrides prior initialization of this subobject}}
+};
+
+int arr[1] = {[0] = 0}; // expected-warning {{array designators are a C99 extension}}
+
+struct Pt { int x, y; };
+struct Rect { Pt tl, br; };
+Rect r = {
+ .tl.x = 0 // expected-warning {{nested designators are a C99 extension}}
+};
+
+struct NonTrivial {
+ NonTrivial();
+ ~NonTrivial();
+};
+struct S {
+ int a;
+ NonTrivial b;
+};
+struct T {
+ S s;
+};
+S f();
+
+T t1 = {
+ .s = f()
+};
+
+// It's important that we reject this; we would not destroy the existing
+// 'NonTrivial' object before overwriting it (and even calling its destructor
+// would not necessarily be correct).
+T t2 = {
+ .s = f(), // expected-note {{previous}}
+ .s.b = NonTrivial() // expected-error {{initializer would partially override prior initialization of object of type 'S' with non-trivial destruction}}
+ // expected-warning@-1 {{nested}}
+};
+
+// FIXME: It might be reasonable to accept this.
+T t3 = {
+ .s = f(), // expected-note {{previous}}
+ .s.a = 0 // expected-error {{initializer would partially override prior initialization of object of type 'S' with non-trivial destruction}}
+ // expected-warning@-1 {{nested}}
+};
diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp
index e9e083950c1..eaac64d21e9 100644
--- a/clang/test/SemaCXX/constant-expression-cxx11.cpp
+++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -triple x86_64-linux -Wno-string-plus-int -Wno-pointer-arith -Wno-zero-length-array -fsyntax-only -fcxx-exceptions -verify -std=c++11 -pedantic %s -Wno-comment -Wno-tautological-pointer-compare -Wno-bool-conversion
+// RUN: %clang_cc1 -triple x86_64-linux -Wno-string-plus-int -Wno-pointer-arith -Wno-zero-length-array -Wno-c99-designator -fsyntax-only -fcxx-exceptions -verify -std=c++11 -pedantic %s -Wno-comment -Wno-tautological-pointer-compare -Wno-bool-conversion
namespace StaticAssertFoldTest {
@@ -566,7 +566,7 @@ static_assert(fail(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][2] - 2)) == 11, "
expected-error {{static_assert expression is not an integral constant expression}} \
expected-note {{in call to 'fail(zs[1][0][1][0])'}}
-constexpr int arr[40] = { 1, 2, 3, [8] = 4 }; // expected-warning {{C99 feature}}
+constexpr int arr[40] = { 1, 2, 3, [8] = 4 };
constexpr int SumNonzero(const int *p) {
return *p + (*p ? SumNonzero(p+1) : 0);
}
@@ -979,7 +979,7 @@ union U {
int b;
};
-constexpr U u[4] = { { .a = 0 }, { .b = 1 }, { .a = 2 }, { .b = 3 } }; // expected-warning 4{{C99 feature}}
+constexpr U u[4] = { { .a = 0 }, { .b = 1 }, { .a = 2 }, { .b = 3 } };
static_assert(u[0].a == 0, "");
static_assert(u[0].b, ""); // expected-error {{constant expression}} expected-note {{read of member 'b' of union with active member 'a'}}
static_assert(u[1].b == 1, "");
diff --git a/clang/test/SemaCXX/constexpr-printing.cpp b/clang/test/SemaCXX/constexpr-printing.cpp
index 7f6a9c6a82f..ebd91b8a3ca 100644
--- a/clang/test/SemaCXX/constexpr-printing.cpp
+++ b/clang/test/SemaCXX/constexpr-printing.cpp
@@ -41,11 +41,7 @@ expected-error {{constant expression}} \
expected-note {{in call to 'test_printing(12, 3.976200e+01, 3+4i, 1.290000e+01+3.600000e+00i, &u2.T::arr[4], u2.another.arr[2], {5, 1, 2, 3}, {{{}}, {{}}, &u1.T::arr[2]})'}}
struct V {
- // FIXME: when we can generate these as constexpr constructors, remove the
- // explicit definitions.
- constexpr V() : arr{[255] = 42} {}
- constexpr V(const V &v) : arr{[255] = 42} {}
- int arr[256];
+ int arr[256] = {[255] = 42}; // expected-warning {{C99}}
};
constexpr V v;
constexpr int get(const int *p) { return *p; } // expected-note {{read of dereferenced one-past-the-end pointer}}
diff --git a/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp b/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp
index 07a233b56ce..870bbe5ce36 100644
--- a/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp
+++ b/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp
@@ -406,6 +406,6 @@ namespace PR11410 {
0, 1
}; // expected-error {{ambiguous}} expected-note {{in implicit initialization of array element 2}}
C c2[3] = {
- [0] = 1, [2] = 3
+ [0] = 1, [2] = 3 // expected-warning {{C99}}
}; // expected-error {{ambiguous}} expected-note {{in implicit initialization of array element 1}}
}
diff --git a/clang/test/SemaCXX/cxx2a-initializer-aggregates.cpp b/clang/test/SemaCXX/cxx2a-initializer-aggregates.cpp
index 9c438d399b3..a974f3d7266 100644
--- a/clang/test/SemaCXX/cxx2a-initializer-aggregates.cpp
+++ b/clang/test/SemaCXX/cxx2a-initializer-aggregates.cpp
@@ -1,4 +1,9 @@
-// RUN: %clang_cc1 -std=c++2a %s -verify
+// RUN: %clang_cc1 -std=c++2a %s -verify=expected,pedantic,override,reorder -pedantic-errors
+// RUN: %clang_cc1 -std=c++2a %s -verify=expected,pedantic -Werror=c99-designator -Wno-reorder -Wno-initializer-overrides
+// RUN: %clang_cc1 -std=c++2a %s -verify=expected,reorder -Wno-c99-designator -Werror=reorder -Wno-initializer-overrides
+// RUN: %clang_cc1 -std=c++2a %s -verify=expected,override -Wno-c99-designator -Wno-reorder -Werror=initializer-overrides
+// RUN: %clang_cc1 -std=c++2a %s -verify -Wno-c99-designator -Wno-reorder -Wno-initializer-overrides
+
namespace class_with_ctor {
struct A { // expected-note 6{{candidate}}
@@ -21,3 +26,105 @@ namespace class_with_ctor {
C c1 = {{}, {}}; // ok, call default ctor twice
C c2 = {{1, 2}, {3, 4}}; // expected-error 2{{no matching constructor}}
}
+
+namespace designator {
+struct A { int x, y; };
+struct B { A a; };
+
+A a1 = {
+ .y = 1, // reorder-note {{previous initialization for field 'y' is here}}
+ .x = 2 // reorder-error {{ISO C++ requires field designators to be specified in declaration order; field 'y' will be initialized after field 'x'}}
+};
+int arr[3] = {[1] = 5}; // pedantic-error {{array designators are a C99 extension}}
+B b = {.a.x = 0}; // pedantic-error {{nested designators are a C99 extension}}
+A a2 = {
+ .x = 1, // pedantic-error {{mixture of designated and non-designated initializers in the same initializer list is a C99 extension}}
+ 2 // pedantic-note {{first non-designated initializer is here}}
+};
+A a3 = {
+ 1, // pedantic-note {{first non-designated initializer is here}}
+ .y = 2 // pedantic-error {{mixture of designated and non-designated initializers in the same initializer list is a C99 extension}}
+};
+A a4 = {
+ .x = 1, // override-note {{previous}}
+ .x = 1 // override-error {{overrides prior initialization}}
+};
+A a5 = {
+ .y = 1, // override-note {{previous}}
+ .y = 1 // override-error {{overrides prior initialization}}
+};
+struct C { int :0, x, :0, y, :0; };
+C c = {
+ .x = 1, // override-note {{previous}}
+ .x = 1, // override-error {{overrides prior initialization}} override-note {{previous}}
+ .y = 1, // override-note {{previous}}
+ .y = 1, // override-error {{overrides prior initialization}}
+ .x = 1, // reorder-error {{declaration order}} override-error {{overrides prior initialization}} override-note {{previous}}
+ .x = 1, // override-error {{overrides prior initialization}}
+};
+}
+
+namespace base_class {
+ struct base {
+ int x;
+ };
+ struct derived : base {
+ int y;
+ };
+ derived d = {.x = 1, .y = 2}; // expected-error {{'x' does not refer to any field}}
+}
+
+namespace union_ {
+ union U { int a, b; };
+ U u = {
+ .a = 1, // override-note {{here}}
+ .b = 2, // override-error {{overrides prior}}
+ };
+}
+
+namespace overload_resolution {
+ struct A { int x, y; };
+ union B { int x, y; };
+
+ void f(A a);
+ void f(B b) = delete;
+ void g() { f({.x = 1, .y = 2}); } // ok, calls non-union overload
+
+ // As an extension of the union case, overload resolution won't pick any
+ // candidate where a field initializer would be overridden.
+ struct A2 { int x, other, y; };
+ int f(A2);
+ void g2() { int k = f({.x = 1, 2, .y = 3}); (void)k; } // pedantic-error {{mixture of designated and non-designated}} pedantic-note {{here}}
+
+ struct C { int x; };
+ void h(A a); // expected-note {{candidate}}
+ void h(C c); // expected-note {{candidate}}
+ void i() {
+ h({.x = 1, .y = 2});
+ h({.y = 1, .x = 2}); // reorder-error {{declaration order}} reorder-note {{previous}}
+ h({.x = 1}); // expected-error {{ambiguous}}
+ }
+
+ struct D { int y, x; };
+ void j(A a); // expected-note {{candidate}}
+ void j(D d); // expected-note {{candidate}}
+ void k() {
+ j({.x = 1, .y = 2}); // expected-error {{ambiguous}}
+ }
+}
+
+namespace deduction {
+ struct A { int x, y; };
+ union B { int x, y; };
+
+ template<typename T, typename U> void f(decltype(T{.x = 1, .y = 2}) = {});
+ template<typename T, typename U> void f(decltype(U{.x = 1, .y = 2}) = {}) = delete;
+ void g() { f<A, B>(); } // ok, calls non-union overload
+
+ struct C { int y, x; };
+ template<typename T, typename U> void h(decltype(T{.y = 1, .x = 2}) = {}) = delete;
+ template<typename T, typename U> void h(decltype(U{.y = 1, .x = 2}) = {});
+ void i() {
+ h<A, C>(); // ok, selects C overload by SFINAE
+ }
+}
diff --git a/clang/test/SemaCXX/decltype.cpp b/clang/test/SemaCXX/decltype.cpp
index 2956f9a228e..f06ca226bca 100644
--- a/clang/test/SemaCXX/decltype.cpp
+++ b/clang/test/SemaCXX/decltype.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Wno-c99-designator %s
// PR5290
int const f0();
@@ -80,22 +80,22 @@ namespace D5789 {
struct P1 { char x[6]; } g1 = { "foo" };
struct LP1 { struct P1 p1; };
- // expected-warning@+3 {{subobject initialization overrides}}
+ // expected-warning@+3 {{initializer partially overrides}}
// expected-note@+2 {{previous initialization}}
// expected-note@+1 {{previous definition}}
template<class T> void foo(decltype(T(LP1{ .p1 = g1, .p1.x[1] = 'x' }))) {}
- // expected-warning@+3 {{subobject initialization overrides}}
+ // expected-warning@+3 {{initializer partially overrides}}
// expected-note@+2 {{previous initialization}}
template<class T>
void foo(decltype(T(LP1{ .p1 = g1, .p1.x[1] = 'r' }))) {} // okay
- // expected-warning@+3 {{subobject initialization overrides}}
+ // expected-warning@+3 {{initializer partially overrides}}
// expected-note@+2 {{previous initialization}}
template<class T>
void foo(decltype(T(LP1{ .p1 = { "foo" }, .p1.x[1] = 'x'}))) {} // okay
- // expected-warning@+3 {{subobject initialization overrides}}
+ // expected-warning@+3 {{initializer partially overrides}}
// expected-note@+2 {{previous initialization}}
// expected-error@+1 {{redefinition of 'foo'}}
template<class T> void foo(decltype(T(LP1{ .p1 = g1, .p1.x[1] = 'x' }))) {}
diff --git a/clang/test/SemaCXX/designated-initializers-base-class.cpp b/clang/test/SemaCXX/designated-initializers-base-class.cpp
index 9c2e61ea2a6..2aa9603e443 100644
--- a/clang/test/SemaCXX/designated-initializers-base-class.cpp
+++ b/clang/test/SemaCXX/designated-initializers-base-class.cpp
@@ -1,5 +1,4 @@
// RUN: %clang_cc1 %s -std=c++1z -fsyntax-only -verify -Winitializer-overrides
-// expected-no-diagnostics
struct B {
int x;
@@ -9,4 +8,4 @@ struct D : B {
int y;
};
-void test() { D d = {1, .y = 2}; }
+void test() { D d = {1, .y = 2}; } // expected-warning {{C99 extension}} expected-note {{}}
diff --git a/clang/test/SemaCXX/designated-initializers.cpp b/clang/test/SemaCXX/designated-initializers.cpp
index 739817372eb..a897e5a4e54 100644
--- a/clang/test/SemaCXX/designated-initializers.cpp
+++ b/clang/test/SemaCXX/designated-initializers.cpp
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Winitializer-overrides %s
-// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Woverride-init %s
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Wno-reorder -Wno-c99-designator -Winitializer-overrides %s
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Wno-reorder -Wno-c99-designator -Woverride-init %s
template <typename T> struct Foo {
struct SubFoo {
diff --git a/clang/test/SemaCXX/eval-crashes.cpp b/clang/test/SemaCXX/eval-crashes.cpp
index 60c2deed4d3..3e59ad31c55 100644
--- a/clang/test/SemaCXX/eval-crashes.cpp
+++ b/clang/test/SemaCXX/eval-crashes.cpp
@@ -37,7 +37,7 @@ namespace pr33140_3 {
struct X {
Y_t a;
};
- struct X foo[2] = {[0 ... 1] = {.a = (Y_t){.c = 0}}};
+ struct X foo[2] = {[0 ... 1] = {.a = (Y_t){.c = 0}}}; // expected-warning {{C99 extension}}
}
namespace pr33140_6 {
diff --git a/clang/test/SemaCXX/member-init.cpp b/clang/test/SemaCXX/member-init.cpp
index 3fcee50e63a..f2c06446265 100644
--- a/clang/test/SemaCXX/member-init.cpp
+++ b/clang/test/SemaCXX/member-init.cpp
@@ -184,7 +184,7 @@ void g() { f<int>(); } // expected-note {{in instantiation of function template
namespace PR22056 {
template <int N>
struct S {
- int x[3] = {[N] = 3};
+ int x[3] = {[N] = 3}; // expected-warning {{C99 extension}}
};
}
OpenPOWER on IntegriCloud