summaryrefslogtreecommitdiff
path: root/test/SemaCXX/new-delete.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaCXX/new-delete.cpp')
-rw-r--r--test/SemaCXX/new-delete.cpp71
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
}
}