diff options
Diffstat (limited to 'test/SemaCXX/new-delete.cpp')
-rw-r--r-- | test/SemaCXX/new-delete.cpp | 71 |
1 files changed, 62 insertions, 9 deletions
diff --git a/test/SemaCXX/new-delete.cpp b/test/SemaCXX/new-delete.cpp index e96603d69e10..cb0d030d99c2 100644 --- a/test/SemaCXX/new-delete.cpp +++ b/test/SemaCXX/new-delete.cpp @@ -1,7 +1,12 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu -Wno-new-returns-null +// RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++98 +// RUN: %clang_cc1 -fsyntax-only -verify %s -triple=i686-pc-linux-gnu -Wno-new-returns-null -std=c++11 #include <stddef.h> +#if __cplusplus >= 201103L +// expected-note@+2 {{candidate constructor (the implicit move constructor) not viable}} +#endif struct S // expected-note {{candidate}} { S(int, int, double); // expected-note {{candidate}} @@ -72,7 +77,13 @@ void bad_news(int *ip) (void)new; // expected-error {{expected a type}} (void)new 4; // expected-error {{expected a type}} (void)new () int; // expected-error {{expected expression}} - (void)new int[1.1]; // expected-error {{array size expression must have integral or enumeration type, not 'double'}} + (void)new int[1.1]; +#if __cplusplus <= 199711L + // expected-error@-2 {{array size expression must have integral or enumeration type, not 'double'}} +#else + // expected-error@-4 {{array size expression must have integral or unscoped enumeration type, not 'double'}} +#endif + (void)new int[1][i]; // expected-error {{only the first dimension}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}} (void)new (int[1][i]); // expected-error {{only the first dimension}} expected-note {{read of non-const variable 'i' is not allowed in a constant expression}} (void)new (int[i]); // expected-warning {{when type is in parentheses}} @@ -85,7 +96,13 @@ void bad_news(int *ip) // Undefined, but clang should reject it directly. (void)new int[-1]; // expected-error {{array size is negative}} (void)new int[2000000000]; // expected-error {{array is too large}} - (void)new int[*(S*)0]; // expected-error {{array size expression must have integral or enumeration type, not 'S'}} + (void)new int[*(S*)0]; +#if __cplusplus <= 199711L + // expected-error@-2 {{array size expression must have integral or enumeration type, not 'S'}} +#else + // expected-error@-4 {{array size expression must have integral or unscoped enumeration type, not 'S'}} +#endif + (void)::S::new int; // expected-error {{expected unqualified-id}} (void)new (0, 0) int; // expected-error {{no matching function for call to 'operator new'}} (void)new (0L) int; // expected-error {{call to 'operator new' is ambiguous}} @@ -109,7 +126,12 @@ void good_deletes() void bad_deletes() { delete 0; // expected-error {{cannot delete expression of type 'int'}} - delete [0] (int*)0; // expected-error {{expected expression}} + delete [0] (int*)0; +#if __cplusplus <= 199711L + // expected-error@-2 {{expected expression}} +#else + // expected-error@-4 {{expected variable name or 'this' in lambda capture list}} +#endif delete (void*)0; // expected-warning {{cannot delete expression with pointer-to-'void' type 'void *'}} delete (T*)0; // expected-warning {{deleting pointer to incomplete type}} ::S::delete (int*)0; // expected-error {{expected unqualified-id}} @@ -209,14 +231,31 @@ void f(X9 *x9) { struct X10 { virtual ~X10(); +#if __cplusplus >= 201103L + // expected-note@-2 {{overridden virtual function is here}} +#endif }; -struct X11 : X10 { // expected-error {{no suitable member 'operator delete' in 'X11'}} - void operator delete(void*, int); // expected-note {{'operator delete' declared here}} +struct X11 : X10 { +#if __cplusplus <= 199711L +// expected-error@-2 {{no suitable member 'operator delete' in 'X11'}} +#else +// expected-error@-4 {{deleted function '~X11' cannot override a non-deleted function}} +// expected-note@-5 2 {{virtual destructor requires an unambiguous, accessible 'operator delete'}} +#endif + void operator delete(void*, int); +#if __cplusplus <= 199711L + // expected-note@-2 {{'operator delete' declared here}} +#endif }; void f() { - X11 x11; // expected-note {{implicit destructor for 'X11' first required here}} + X11 x11; +#if __cplusplus <= 199711L + // expected-note@-2 {{implicit destructor for 'X11' first required here}} +#else + // expected-error@-4 {{attempt to use a deleted function}} +#endif } struct X12 { @@ -398,10 +437,24 @@ namespace PR7702 { } namespace ArrayNewNeedsDtor { - struct A { A(); private: ~A(); }; // expected-note {{declared private here}} - struct B { B(); A a; }; // expected-error {{field of type 'ArrayNewNeedsDtor::A' has private destructor}} + struct A { A(); private: ~A(); }; +#if __cplusplus <= 199711L + // expected-note@-2 {{declared private here}} +#endif + struct B { B(); A a; }; +#if __cplusplus <= 199711L + // expected-error@-2 {{field of type 'ArrayNewNeedsDtor::A' has private destructor}} +#else + // expected-note@-4 {{destructor of 'B' is implicitly deleted because field 'a' has an inaccessible destructor}} +#endif + B *test9() { - return new B[5]; // expected-note {{implicit destructor for 'ArrayNewNeedsDtor::B' first required here}} + return new B[5]; +#if __cplusplus <= 199711L + // expected-note@-2 {{implicit destructor for 'ArrayNewNeedsDtor::B' first required here}} +#else + // expected-error@-4 {{attempt to use a deleted function}} +#endif } } |