forked from OSchip/llvm-project
Lit C++11 Compatibility Patch #8
24 tests have been updated for C++11 compatibility. llvm-svn: 266387
This commit is contained in:
parent
4960fbf391
commit
1a88adbb27
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-show-option -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-show-option -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-show-option -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-show-option -verify -std=c++11 %s
|
||||||
|
|
||||||
// C++98 [basic.lookup.classref]p1:
|
// C++98 [basic.lookup.classref]p1:
|
||||||
// In a class member access expression (5.2.5), if the . or -> token is
|
// In a class member access expression (5.2.5), if the . or -> token is
|
||||||
|
@ -21,10 +23,16 @@
|
||||||
|
|
||||||
// From PR 7247
|
// From PR 7247
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct set{}; // expected-note{{lookup from the current scope refers here}}
|
struct set{};
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{lookup from the current scope refers here}}
|
||||||
|
#endif
|
||||||
struct Value {
|
struct Value {
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void set(T value) {} // expected-note{{lookup in the object type 'Value' refers here}}
|
void set(T value) {}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{lookup in the object type 'Value' refers here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
void resolves_to_same() {
|
void resolves_to_same() {
|
||||||
Value v;
|
Value v;
|
||||||
|
@ -36,7 +44,10 @@ void resolves_to_different() {
|
||||||
Value v;
|
Value v;
|
||||||
// The fact that the next line is a warning rather than an error is an
|
// The fact that the next line is a warning rather than an error is an
|
||||||
// extension.
|
// extension.
|
||||||
v.set<double>(3.2); // expected-warning{{lookup of 'set' in member access expression is ambiguous; using member of 'Value'}}
|
v.set<double>(3.2);
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{lookup of 'set' in member access expression is ambiguous; using member of 'Value'}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
int set; // Non-template.
|
int set; // Non-template.
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
struct Outer {
|
struct Outer {
|
||||||
struct Inner {
|
struct Inner {
|
||||||
|
@ -41,7 +43,10 @@ class A {
|
||||||
UndeclaredSoFar x; // expected-error {{unknown type name 'UndeclaredSoFar'}}
|
UndeclaredSoFar x; // expected-error {{unknown type name 'UndeclaredSoFar'}}
|
||||||
|
|
||||||
void a_member();
|
void a_member();
|
||||||
friend void A::a_member(); // expected-error {{friends cannot be members of the declaring class}}
|
friend void A::a_member();
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{friends cannot be members of the declaring class}}
|
||||||
|
#endif
|
||||||
friend void a_member(); // okay (because we ignore class scopes when looking up friends)
|
friend void a_member(); // okay (because we ignore class scopes when looking up friends)
|
||||||
friend class A::AInner; // this is okay as an extension
|
friend class A::AInner; // this is okay as an extension
|
||||||
friend class AInner; // okay, refers to ::AInner
|
friend class AInner; // okay, refers to ::AInner
|
||||||
|
|
|
@ -1,10 +1,18 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
struct B0;
|
struct B0;
|
||||||
|
|
||||||
class A {
|
class A {
|
||||||
friend class B {}; // expected-error {{cannot define a type in a friend declaration}}
|
friend class B {}; // expected-error {{cannot define a type in a friend declaration}}
|
||||||
friend int; // expected-warning {{non-class friend type 'int' is a C++11 extension}}
|
friend int;
|
||||||
friend B0; // expected-warning {{specify 'struct' to befriend 'B0'}}
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{non-class friend type 'int' is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
friend B0;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{unelaborated friend declaration is a C++11 extension; specify 'struct' to befriend 'B0'}}
|
||||||
|
#endif
|
||||||
friend class C; // okay
|
friend class C; // okay
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
// PR10034
|
// PR10034
|
||||||
struct X {};
|
struct X {};
|
||||||
|
@ -40,8 +42,16 @@ struct Z {
|
||||||
};
|
};
|
||||||
|
|
||||||
void test_Z() {
|
void test_Z() {
|
||||||
goto end; // expected-error{{cannot jump from this goto statement to its label}}
|
goto end;
|
||||||
Z z; // expected-note{{jump bypasses initialization of non-POD variable}}
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{cannot jump from this goto statement to its label}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Z z;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{jump bypasses initialization of non-POD variable}}
|
||||||
|
#endif
|
||||||
|
|
||||||
end:
|
end:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify -triple=x86_64-linux-gnu %s
|
// RUN: %clang_cc1 -fsyntax-only -verify -triple=x86_64-linux-gnu %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -triple=x86_64-linux-gnu -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -triple=x86_64-linux-gnu -std=c++11 %s
|
||||||
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -triple=x86_64-linux-gnu %s -DCPP11ONLY
|
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -triple=x86_64-linux-gnu %s -DCPP11ONLY
|
||||||
|
|
||||||
// C++11 [temp.arg.nontype]p1:
|
// C++11 [temp.arg.nontype]p1:
|
||||||
|
@ -31,43 +33,103 @@ namespace non_type_tmpl_param {
|
||||||
// if the corresopnding template-parameter is a reference; or
|
// if the corresopnding template-parameter is a reference; or
|
||||||
namespace addr_of_obj_or_func {
|
namespace addr_of_obj_or_func {
|
||||||
template <int* p> struct X0 { }; // expected-note 5{{here}}
|
template <int* p> struct X0 { }; // expected-note 5{{here}}
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-note@-2 2{{template parameter is declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
template <int (*fp)(int)> struct X1 { };
|
template <int (*fp)(int)> struct X1 { };
|
||||||
template <int &p> struct X2 { }; // expected-note 4{{here}}
|
template <int &p> struct X2 { }; // expected-note 4{{here}}
|
||||||
template <const int &p> struct X2k { }; // expected-note {{here}}
|
template <const int &p> struct X2k { }; // expected-note {{here}}
|
||||||
template <int (&fp)(int)> struct X3 { }; // expected-note 4{{here}}
|
template <int (&fp)(int)> struct X3 { }; // expected-note 4{{here}}
|
||||||
|
|
||||||
int i = 42;
|
int i = 42;
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-note@-2 {{declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
int iarr[10];
|
int iarr[10];
|
||||||
int f(int i);
|
int f(int i);
|
||||||
const int ki = 9; // expected-note 5{{here}}
|
const int ki = 9;
|
||||||
__thread int ti = 100; // expected-note 2{{here}}
|
#if __cplusplus <= 199711L
|
||||||
static int f_internal(int); // expected-note 4{{here}}
|
// expected-note@-2 5{{non-type template argument refers to object here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__thread int ti = 100; // expected-note {{here}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int f_internal(int);
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 4{{non-type template argument refers to function here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
template <typename T> T f_tmpl(T t);
|
template <typename T> T f_tmpl(T t);
|
||||||
struct S { union { int NonStaticMember; }; };
|
struct S { union { int NonStaticMember; }; };
|
||||||
|
|
||||||
void test() {
|
void test() {
|
||||||
X0<i> x0a; // expected-error {{must have its address taken}}
|
X0<i> x0a;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{non-type template argument for template parameter of pointer type 'int *' must have its address taken}}
|
||||||
|
#else
|
||||||
|
// expected-error@-4 {{non-type template argument of type 'int' is not a constant expression}}
|
||||||
|
// expected-note@-5 {{read of non-const variable 'i' is not allowed in a constant expression}}
|
||||||
|
#endif
|
||||||
X0<&i> x0a_addr;
|
X0<&i> x0a_addr;
|
||||||
X0<iarr> x0b;
|
X0<iarr> x0b;
|
||||||
X0<&iarr> x0b_addr; // expected-error {{cannot be converted to a value of type 'int *'}}
|
X0<&iarr> x0b_addr; // expected-error {{cannot be converted to a value of type 'int *'}}
|
||||||
X0<ki> x0c; // expected-error {{must have its address taken}} expected-warning {{internal linkage is a C++11 extension}}
|
X0<ki> x0c; // expected-error {{must have its address taken}}
|
||||||
X0<&ki> x0c_addr; // expected-error {{cannot be converted to a value of type 'int *'}} expected-warning {{internal linkage is a C++11 extension}}
|
#if __cplusplus <= 199711L
|
||||||
X0<&ti> x0d_addr; // expected-error {{refers to thread-local object}}
|
// expected-warning@-2 {{internal linkage is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
X0<&ki> x0c_addr; // expected-error {{cannot be converted to a value of type 'int *'}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{internal linkage is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
X0<&ti> x0d_addr;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{non-type template argument refers to thread-local object}}
|
||||||
|
#else
|
||||||
|
// expected-error@-4 {{non-type template argument of type 'int *' is not a constant expression}}
|
||||||
|
#endif
|
||||||
|
|
||||||
X1<f> x1a;
|
X1<f> x1a;
|
||||||
X1<&f> x1a_addr;
|
X1<&f> x1a_addr;
|
||||||
X1<f_tmpl> x1b;
|
X1<f_tmpl> x1b;
|
||||||
X1<&f_tmpl> x1b_addr;
|
X1<&f_tmpl> x1b_addr;
|
||||||
X1<f_tmpl<int> > x1c;
|
X1<f_tmpl<int> > x1c;
|
||||||
X1<&f_tmpl<int> > x1c_addr;
|
X1<&f_tmpl<int> > x1c_addr;
|
||||||
X1<f_internal> x1d; // expected-warning {{internal linkage is a C++11 extension}}
|
X1<f_internal> x1d;
|
||||||
X1<&f_internal> x1d_addr; // expected-warning {{internal linkage is a C++11 extension}}
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{internal linkage is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
X1<&f_internal> x1d_addr;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{internal linkage is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
X2<i> x2a;
|
X2<i> x2a;
|
||||||
X2<&i> x2a_addr; // expected-error {{address taken}}
|
X2<&i> x2a_addr; // expected-error {{address taken}}
|
||||||
X2<iarr> x2b; // expected-error {{cannot bind to template argument of type 'int [10]'}}
|
X2<iarr> x2b; // expected-error {{cannot bind to template argument of type 'int [10]'}}
|
||||||
X2<&iarr> x2b_addr; // expected-error {{address taken}}
|
X2<&iarr> x2b_addr; // expected-error {{address taken}}
|
||||||
X2<ki> x2c; // expected-error {{ignores qualifiers}} expected-warning {{internal linkage is a C++11 extension}}
|
X2<ki> x2c; // expected-error {{ignores qualifiers}}
|
||||||
X2k<ki> x2kc; // expected-warning {{internal linkage is a C++11 extension}}
|
#if __cplusplus <= 199711L
|
||||||
X2k<&ki> x2kc_addr; // expected-error {{address taken}} expected-warning {{internal linkage is a C++11 extension}}
|
// expected-warning@-2 {{internal linkage is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
X2k<ki> x2kc;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{internal linkage is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
X2k<&ki> x2kc_addr; // expected-error {{address taken}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{internal linkage is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
X2<ti> x2d_addr; // expected-error {{refers to thread-local object}}
|
X2<ti> x2d_addr; // expected-error {{refers to thread-local object}}
|
||||||
X3<f> x3a;
|
X3<f> x3a;
|
||||||
X3<&f> x3a_addr; // expected-error {{address taken}}
|
X3<&f> x3a_addr; // expected-error {{address taken}}
|
||||||
|
@ -75,11 +137,31 @@ namespace addr_of_obj_or_func {
|
||||||
X3<&f_tmpl> x3b_addr; // expected-error {{address taken}}
|
X3<&f_tmpl> x3b_addr; // expected-error {{address taken}}
|
||||||
X3<f_tmpl<int> > x3c;
|
X3<f_tmpl<int> > x3c;
|
||||||
X3<&f_tmpl<int> > x3c_addr; // expected-error {{address taken}}
|
X3<&f_tmpl<int> > x3c_addr; // expected-error {{address taken}}
|
||||||
X3<f_internal> x3d; // expected-warning {{internal linkage is a C++11 extension}}
|
X3<f_internal> x3d;
|
||||||
X3<&f_internal> x3d_addr; // expected-error {{address taken}} expected-warning {{internal linkage is a C++11 extension}}
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{internal linkage is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
X3<&f_internal> x3d_addr; // expected-error {{address taken}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{internal linkage is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int n;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{non-type template argument refers to object here}}
|
||||||
|
#else
|
||||||
|
// expected-note@-4 {{declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
X0<&n> x0_no_linkage;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{non-type template argument refers to object 'n' that does not have linkage}}
|
||||||
|
#else
|
||||||
|
// expected-error@-4 {{non-type template argument of type 'int *' is not a constant expression}}
|
||||||
|
// expected-note@-5 {{pointer to 'n' is not a constant expression}}
|
||||||
|
#endif
|
||||||
|
|
||||||
int n; // expected-note {{here}}
|
|
||||||
X0<&n> x0_no_linkage; // expected-error {{non-type template argument refers to object 'n' that does not have linkage}}
|
|
||||||
struct Local { static int f() {} }; // expected-note {{here}}
|
struct Local { static int f() {} }; // expected-note {{here}}
|
||||||
X1<&Local::f> x1_no_linkage; // expected-error {{non-type template argument refers to function 'f' that does not have linkage}}
|
X1<&Local::f> x1_no_linkage; // expected-error {{non-type template argument refers to function 'f' that does not have linkage}}
|
||||||
X0<&S::NonStaticMember> x0_non_static; // expected-error {{non-static data member}}
|
X0<&S::NonStaticMember> x0_non_static; // expected-error {{non-static data member}}
|
||||||
|
@ -96,7 +178,17 @@ namespace bad_args {
|
||||||
int i = 42;
|
int i = 42;
|
||||||
X0<&i + 2> x0a; // expected-error{{non-type template argument does not refer to any declaration}}
|
X0<&i + 2> x0a; // expected-error{{non-type template argument does not refer to any declaration}}
|
||||||
int* iptr = &i;
|
int* iptr = &i;
|
||||||
X0<iptr> x0b; // expected-error{{non-type template argument for template parameter of pointer type 'int *' must have its address taken}}
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-note@-2 {{declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
X0<iptr> x0b;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{non-type template argument for template parameter of pointer type 'int *' must have its address taken}}
|
||||||
|
#else
|
||||||
|
// expected-error@-4 {{non-type template argument of type 'int *' is not a constant expression}}
|
||||||
|
// expected-note@-5 {{read of non-constexpr variable 'iptr' is not allowed in a constant expression}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif // CPP11ONLY
|
#endif // CPP11ONLY
|
||||||
|
|
||||||
|
@ -108,4 +200,4 @@ int f();
|
||||||
}
|
}
|
||||||
#endif // CPP11ONLY
|
#endif // CPP11ONLY
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
template<class T> struct A {
|
template<class T> struct A {
|
||||||
static T t; // expected-error{{static data member instantiated with function type 'int ()'}}
|
static T t; // expected-error{{static data member instantiated with function type 'int ()'}}
|
||||||
};
|
};
|
||||||
|
@ -11,10 +14,17 @@ template<typename T> struct B {
|
||||||
B<function> b; // expected-note{{instantiation of}}
|
B<function> b; // expected-note{{instantiation of}}
|
||||||
|
|
||||||
template <typename T> int f0(void *, const T&); // expected-note{{candidate template ignored: substitution failure}}
|
template <typename T> int f0(void *, const T&); // expected-note{{candidate template ignored: substitution failure}}
|
||||||
enum {e}; // expected-note{{unnamed type used in template argument was declared here}}
|
enum {e};
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{unnamed type used in template argument was declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
void test_f0(int n) {
|
void test_f0(int n) {
|
||||||
int i = f0(0, e); // expected-warning{{template argument uses unnamed type}}
|
int i = f0(0, e);
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{template argument uses unnamed type}}
|
||||||
|
#endif
|
||||||
|
|
||||||
int vla[n];
|
int vla[n];
|
||||||
f0(0, vla); // expected-error{{no matching function for call to 'f0'}}
|
f0(0, vla); // expected-error{{no matching function for call to 'f0'}}
|
||||||
}
|
}
|
||||||
|
@ -23,20 +33,50 @@ namespace N0 {
|
||||||
template <typename R, typename A1> void f0(R (*)(A1));
|
template <typename R, typename A1> void f0(R (*)(A1));
|
||||||
template <typename T> int f1(T);
|
template <typename T> int f1(T);
|
||||||
template <typename T, typename U> int f1(T, U);
|
template <typename T, typename U> int f1(T, U);
|
||||||
enum {e1}; // expected-note 2{{unnamed type used in template argument was declared here}}
|
enum {e1};
|
||||||
enum {e2}; // expected-note 2{{unnamed type used in template argument was declared here}}
|
#if __cplusplus <= 199711L
|
||||||
enum {e3}; // expected-note{{unnamed type used in template argument was declared here}}
|
// expected-note@-2 2{{unnamed type used in template argument was declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum {e2};
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 2{{unnamed type used in template argument was declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum {e3};
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{unnamed type used in template argument was declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
template<typename T> struct X;
|
template<typename T> struct X;
|
||||||
template<typename T> struct X<T*> { };
|
template<typename T> struct X<T*> { };
|
||||||
|
|
||||||
void f() {
|
void f() {
|
||||||
f0( // expected-warning{{template argument uses unnamed type}}
|
f0(
|
||||||
&f1<__typeof__(e1)>); // expected-warning{{template argument uses unnamed type}}
|
#if __cplusplus <= 199711L
|
||||||
int (*fp1)(int, __typeof__(e2)) = f1; // expected-warning{{template argument uses unnamed type}}
|
// expected-warning@-2 {{template argument uses unnamed type}}
|
||||||
f1(e2); // expected-warning{{template argument uses unnamed type}}
|
#endif
|
||||||
|
|
||||||
|
&f1<__typeof__(e1)>);
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{template argument uses unnamed type}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int (*fp1)(int, __typeof__(e2)) = f1;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{template argument uses unnamed type}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
f1(e2);
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{template argument uses unnamed type}}
|
||||||
|
#endif
|
||||||
|
|
||||||
f1(e2);
|
f1(e2);
|
||||||
|
|
||||||
X<__typeof__(e3)*> x; // expected-warning{{template argument uses unnamed type}}
|
X<__typeof__(e3)*> x;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{template argument uses unnamed type}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,22 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
template <int> int f(int); // expected-note 2{{candidate}}
|
template <int> int f(int); // expected-note {{candidate function}}
|
||||||
template <signed char> int f(int); // expected-note 2{{candidate}}
|
#if __cplusplus <= 199711L
|
||||||
int i1 = f<1>(0); // expected-error{{ambiguous}}
|
// expected-note@-2 {{candidate function}}
|
||||||
int i2 = f<1000>(0); // expected-error{{ambiguous}}
|
#endif
|
||||||
|
|
||||||
|
template <signed char> int f(int); // expected-note {{candidate function}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{candidate function}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int i1 = f<1>(0); // expected-error{{call to 'f' is ambiguous}}
|
||||||
|
int i2 = f<1000>(0);
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2{{call to 'f' is ambiguous}}
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace PR6707 {
|
namespace PR6707 {
|
||||||
template<typename T, T Value>
|
template<typename T, T Value>
|
||||||
|
|
|
@ -1,17 +1,44 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
// RUN: cp %s %t
|
// RUN: cp %s %t
|
||||||
// RUN: not %clang_cc1 -x c++ -fixit %t -DFIXING
|
// RUN: not %clang_cc1 -x c++ -fixit %t -DFIXING
|
||||||
// RUN: %clang_cc1 -x c++ %t -DFIXING
|
// RUN: %clang_cc1 -x c++ %t -DFIXING
|
||||||
|
|
||||||
template<typename T> void f(T) { }
|
template<typename T> void f(T) { }
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-note@-2 {{explicit instantiation refers here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
template<typename T> void g(T) { }
|
template<typename T> void g(T) { }
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-note@-2 {{explicit instantiation refers here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
template<typename T> struct x { };
|
template<typename T> struct x { };
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-note@-2 {{explicit instantiation refers here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
template<typename T> struct y { }; // expected-note {{declared here}}
|
template<typename T> struct y { }; // expected-note {{declared here}}
|
||||||
|
|
||||||
namespace good {
|
namespace good { // Only good in C++98/03
|
||||||
|
#ifndef FIXING
|
||||||
template void f<int>(int);
|
template void f<int>(int);
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-error@-2 {{explicit instantiation of 'f' must occur at global scope}}
|
||||||
|
#endif
|
||||||
|
|
||||||
template void g(int);
|
template void g(int);
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-error@-2 {{explicit instantiation of 'g' must occur at global scope}}
|
||||||
|
#endif
|
||||||
|
|
||||||
template struct x<int>;
|
template struct x<int>;
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-error@-2 {{explicit instantiation of 'x' must occur at global scope}}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace unsupported {
|
namespace unsupported {
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | FileCheck %s
|
// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | FileCheck %s
|
||||||
|
// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -std=c++98 -o - %s | FileCheck %s
|
||||||
|
// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -std=c++11 -o - %s | FileCheck %s
|
||||||
|
|
||||||
// CHECK: @a = global i32 10
|
// CHECK: @a = global i32 10
|
||||||
int a = 10;
|
int a = 10;
|
||||||
|
@ -27,8 +29,13 @@ C g0 = { C::e1 };
|
||||||
|
|
||||||
namespace test2 {
|
namespace test2 {
|
||||||
struct A {
|
struct A {
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
static const double d = 1.0;
|
static const double d = 1.0;
|
||||||
static const float f = d / 2;
|
static const float f = d / 2;
|
||||||
|
#else
|
||||||
|
static constexpr double d = 1.0;
|
||||||
|
static constexpr float f = d / 2;
|
||||||
|
#endif
|
||||||
static int g();
|
static int g();
|
||||||
} a;
|
} a;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -fcxx-exceptions %s
|
// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -fcxx-exceptions %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -fcxx-exceptions -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -fcxx-exceptions -std=c++11 %s
|
||||||
|
|
||||||
class C;
|
class C;
|
||||||
class C {
|
class C {
|
||||||
public:
|
public:
|
||||||
|
@ -69,11 +72,30 @@ public; // expected-error{{expected ':'}}
|
||||||
};
|
};
|
||||||
|
|
||||||
class F {
|
class F {
|
||||||
int F1 { return 1; } // expected-error{{function definition does not declare parameters}}
|
int F1 { return 1; }
|
||||||
void F2 {} // expected-error{{function definition does not declare parameters}}
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{function definition does not declare parameters}}
|
||||||
|
#else
|
||||||
|
// expected-error@-4 {{expected expression}}
|
||||||
|
// expected-error@-5 {{expected}}
|
||||||
|
// expected-note@-6 {{to match this '{'}}
|
||||||
|
// expected-error@-7 {{expected ';' after class}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void F2 {}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{function definition does not declare parameters}}
|
||||||
|
#else
|
||||||
|
// expected-error@-4 {{variable has incomplete type 'void'}}
|
||||||
|
// expected-error@-5 {{expected ';' after top level declarator}}
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef int F3() { return 0; } // expected-error{{function definition declared 'typedef'}}
|
typedef int F3() { return 0; } // expected-error{{function definition declared 'typedef'}}
|
||||||
typedef void F4() {} // expected-error{{function definition declared 'typedef'}}
|
typedef void F4() {} // expected-error{{function definition declared 'typedef'}}
|
||||||
};
|
};
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-error@-2 {{extraneous closing brace}}
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace ctor_error {
|
namespace ctor_error {
|
||||||
class Foo {};
|
class Foo {};
|
||||||
|
@ -203,14 +225,38 @@ namespace BadFriend {
|
||||||
}
|
}
|
||||||
|
|
||||||
class PR20760_a {
|
class PR20760_a {
|
||||||
int a = ); // expected-warning {{extension}} expected-error {{expected expression}}
|
int a = ); // expected-error {{expected expression}}
|
||||||
int b = }; // expected-warning {{extension}} expected-error {{expected expression}}
|
#if __cplusplus <= 199711L
|
||||||
int c = ]; // expected-warning {{extension}} expected-error {{expected expression}}
|
// expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int b = }; // expected-error {{expected expression}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int c = ]; // expected-error {{expected expression}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
class PR20760_b {
|
class PR20760_b {
|
||||||
int d = d); // expected-warning {{extension}} expected-error {{expected ';'}}
|
int d = d); // expected-error {{expected ';'}}
|
||||||
int e = d]; // expected-warning {{extension}} expected-error {{expected ';'}}
|
#if __cplusplus <= 199711L
|
||||||
int f = d // expected-warning {{extension}} expected-error {{expected ';'}}
|
// expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int e = d]; // expected-error {{expected ';'}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int f = d // expected-error {{expected ';'}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace PR20887 {
|
namespace PR20887 {
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -pedantic-errors -fcxx-exceptions -fexceptions %s
|
// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -pedantic-errors -fcxx-exceptions -fexceptions %s
|
||||||
|
// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -pedantic-errors -fcxx-exceptions -fexceptions -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -verify -fsyntax-only -triple i386-linux -pedantic-errors -fcxx-exceptions -fexceptions -std=c++11 %s
|
||||||
|
|
||||||
const char const *x10; // expected-error {{duplicate 'const' declaration specifier}}
|
const char const *x10; // expected-error {{duplicate 'const' declaration specifier}}
|
||||||
|
|
||||||
|
@ -46,7 +48,10 @@ class asm_class_test {
|
||||||
void foo() __asm__("baz");
|
void foo() __asm__("baz");
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { fooenum = 1, }; // expected-error {{commas at the end of enumerator lists are a C++11 extension}}
|
enum { fooenum = 1, };
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{commas at the end of enumerator lists are a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
struct a {
|
struct a {
|
||||||
int Type : fooenum;
|
int Type : fooenum;
|
||||||
|
@ -81,7 +86,11 @@ namespace Commas {
|
||||||
(global5),
|
(global5),
|
||||||
*global6,
|
*global6,
|
||||||
&global7 = global1,
|
&global7 = global1,
|
||||||
&&global8 = static_cast<int&&>(global1), // expected-error 2{{rvalue reference}}
|
&&global8 = static_cast<int&&>(global1),
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 2{{rvalue references are a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
S::a,
|
S::a,
|
||||||
global9,
|
global9,
|
||||||
global10 = 0,
|
global10 = 0,
|
||||||
|
@ -185,7 +194,13 @@ namespace PR15017 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure we produce at least some diagnostic for attributes in C++98.
|
// Ensure we produce at least some diagnostic for attributes in C++98.
|
||||||
[[]] struct S; // expected-error 2{{}}
|
[[]] struct S;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{expected expression}}
|
||||||
|
// expected-error@-3 {{expected unqualified-id}}
|
||||||
|
#else
|
||||||
|
// expected-error@-5 {{an attribute list cannot appear here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace test7 {
|
namespace test7 {
|
||||||
struct Foo {
|
struct Foo {
|
||||||
|
@ -212,14 +227,20 @@ namespace PR5066 {
|
||||||
template<typename T> struct X {};
|
template<typename T> struct X {};
|
||||||
X<int N> x; // expected-error {{type-id cannot have a name}}
|
X<int N> x; // expected-error {{type-id cannot have a name}}
|
||||||
|
|
||||||
using T = int (*T)(); // expected-error {{type-id cannot have a name}} expected-error {{C++11}}
|
using T = int (*T)(); // expected-error {{type-id cannot have a name}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{alias declarations are a C++11 extensio}}
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace PR17255 {
|
namespace PR17255 {
|
||||||
void foo() {
|
void foo() {
|
||||||
typename A::template B<>; // expected-error {{use of undeclared identifier 'A'}} \
|
typename A::template B<>; // expected-error {{use of undeclared identifier 'A'}}
|
||||||
// expected-error {{expected a qualified name after 'typename'}} \
|
#if __cplusplus <= 199711L
|
||||||
// expected-error {{'template' keyword outside of a template}}
|
// expected-error@-2 {{'template' keyword outside of a template}}
|
||||||
|
#endif
|
||||||
|
// expected-error@-4 {{expected a qualified name after 'typename'}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,12 +257,25 @@ namespace DuplicateFriend {
|
||||||
struct A {
|
struct A {
|
||||||
friend void friend f(); // expected-warning {{duplicate 'friend' declaration specifier}}
|
friend void friend f(); // expected-warning {{duplicate 'friend' declaration specifier}}
|
||||||
friend struct B friend; // expected-warning {{duplicate 'friend' declaration specifier}}
|
friend struct B friend; // expected-warning {{duplicate 'friend' declaration specifier}}
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-error@-2 {{'friend' must appear first in a non-function declaration}}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// PR8380
|
// PR8380
|
||||||
extern "" // expected-error {{unknown linkage language}}
|
extern "" // expected-error {{unknown linkage language}}
|
||||||
test6a { ;// expected-error {{C++ requires a type specifier for all declarations}} \
|
test6a { ;// expected-error {{C++ requires a type specifier for all declarations}}
|
||||||
// expected-error {{expected ';' after top level declarator}}
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{expected ';' after top level declarator}}
|
||||||
|
#else
|
||||||
|
// expected-error@-4 {{expected expression}}
|
||||||
|
// expected-note@-5 {{to match this}}
|
||||||
|
#endif
|
||||||
|
|
||||||
int test6b;
|
int test6b;
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-error@+3 {{expected}}
|
||||||
|
// expected-error@-3 {{expected ';' after top level declarator}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
class C {
|
class C {
|
||||||
friend class D;
|
friend class D;
|
||||||
|
@ -21,9 +23,20 @@ class B {
|
||||||
// 'A' here should refer to the declaration above.
|
// 'A' here should refer to the declaration above.
|
||||||
friend class A;
|
friend class A;
|
||||||
|
|
||||||
friend C; // expected-warning {{specify 'class' to befriend}}
|
friend C;
|
||||||
friend U; // expected-warning {{specify 'union' to befriend}}
|
#if __cplusplus <= 199711L
|
||||||
friend int; // expected-warning {{non-class friend type 'int'}}
|
// expected-warning@-2 {{unelaborated friend declaration is a C++11 extension; specify 'class' to befriend 'C'}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
friend U;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{unelaborated friend declaration is a C++11 extension; specify 'union' to befriend 'U'}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
friend int;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{non-class friend type 'int' is a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
friend void myfunc();
|
friend void myfunc();
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
struct S {
|
struct S {
|
||||||
S(); // expected-note {{because type 'S' has a user-provided default constructor}}
|
S();
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{because type 'S' has a user-provided default constructor}}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct { // expected-error {{anonymous structs and classes must be class members}}
|
struct { // expected-error {{anonymous structs and classes must be class members}}
|
||||||
|
@ -9,15 +14,25 @@ struct { // expected-error {{anonymous structs and classes must be class members
|
||||||
|
|
||||||
struct E {
|
struct E {
|
||||||
struct {
|
struct {
|
||||||
S x; // expected-error {{anonymous struct member 'x' has a non-trivial constructor}}
|
S x;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{anonymous struct member 'x' has a non-trivial constructor}}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
static struct {
|
static struct {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T> void foo(T);
|
template <class T> void foo(T);
|
||||||
typedef struct { // expected-note {{use a tag name here to establish linkage prior to definition}} expected-note {{declared here}}
|
typedef struct { // expected-note {{use a tag name here to establish linkage prior to definition}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
void test() {
|
void test() {
|
||||||
foo(this); // expected-warning {{template argument uses unnamed type}}
|
foo(this);
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{template argument uses unnamed type}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
} A; // expected-error {{unsupported: typedef changes linkage of anonymous type, but linkage was already computed}}
|
} A; // expected-error {{unsupported: typedef changes linkage of anonymous type, but linkage was already computed}}
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify -Wc++11-compat %s
|
// RUN: %clang_cc1 -fsyntax-only -verify -Wc++11-compat %s
|
||||||
class C {
|
class C {
|
||||||
public:
|
public:
|
||||||
auto int errx; // expected-error {{storage class specified for a member declaration}} expected-warning {{'auto' storage class specifier is redundant}}
|
auto int errx; // expected-error {{storage class specified for a member declaration}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{'auto' storage class specifier is redundant}}
|
||||||
|
#else
|
||||||
|
// expected-warning@-4 {{'auto' storage class specifier is not permitted in C++11, and will not be supported in future releases}}
|
||||||
|
#endif
|
||||||
register int erry; // expected-error {{storage class specified for a member declaration}}
|
register int erry; // expected-error {{storage class specified for a member declaration}}
|
||||||
extern int errz; // expected-error {{storage class specified for a member declaration}}
|
extern int errz; // expected-error {{storage class specified for a member declaration}}
|
||||||
|
|
||||||
|
@ -36,12 +41,18 @@ public:
|
||||||
|
|
||||||
enum E1 { en1, en2 };
|
enum E1 { en1, en2 };
|
||||||
|
|
||||||
int i = 0; // expected-warning {{in-class initialization of non-static data member is a C++11 extension}}
|
int i = 0;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}}
|
||||||
|
#endif
|
||||||
static int si = 0; // expected-error {{non-const static data member must be initialized out of line}}
|
static int si = 0; // expected-error {{non-const static data member must be initialized out of line}}
|
||||||
static const NestedC ci = 0; // expected-error {{static data member of type 'const C::NestedC' must be initialized out of line}}
|
static const NestedC ci = 0; // expected-error {{static data member of type 'const C::NestedC' must be initialized out of line}}
|
||||||
static const int nci = vs; // expected-error {{in-class initializer for static data member is not a constant expression}}
|
static const int nci = vs; // expected-error {{in-class initializer for static data member is not a constant expression}}
|
||||||
static const int vi = 0;
|
static const int vi = 0;
|
||||||
static const volatile int cvi = 0; // ok, illegal in C++11
|
static const volatile int cvi = 0; // ok, illegal in C++11
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-error@-2 {{static const volatile data member must be initialized out of line}}
|
||||||
|
#endif
|
||||||
static const E evi = 0;
|
static const E evi = 0;
|
||||||
|
|
||||||
void m() {
|
void m() {
|
||||||
|
@ -169,10 +180,18 @@ namespace rdar8066414 {
|
||||||
|
|
||||||
namespace rdar8367341 {
|
namespace rdar8367341 {
|
||||||
float foo();
|
float foo();
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-note@-2 {{declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
struct A {
|
struct A {
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
static const float x = 5.0f; // expected-warning {{in-class initializer for static data member of type 'const float' is a GNU extension}}
|
static const float x = 5.0f; // expected-warning {{in-class initializer for static data member of type 'const float' is a GNU extension}}
|
||||||
static const float y = foo(); // expected-warning {{in-class initializer for static data member of type 'const float' is a GNU extension}} expected-error {{in-class initializer for static data member is not a constant expression}}
|
static const float y = foo(); // expected-warning {{in-class initializer for static data member of type 'const float' is a GNU extension}} expected-error {{in-class initializer for static data member is not a constant expression}}
|
||||||
|
#else
|
||||||
|
static constexpr float x = 5.0f;
|
||||||
|
static constexpr float y = foo(); // expected-error {{constexpr variable 'y' must be initialized by a constant expression}} expected-note {{non-constexpr function 'foo' cannot be used in a constant expression}}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
// RUN: %clang_cc1 -triple %itanium_abi_triple -fsyntax-only -Wbind-to-temporary-copy -verify %s
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -fsyntax-only -Wbind-to-temporary-copy -verify %s
|
||||||
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -fsyntax-only -Wbind-to-temporary-copy -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -triple %itanium_abi_triple -fsyntax-only -Wbind-to-temporary-copy -verify -std=c++11 %s
|
||||||
|
|
||||||
class X {
|
class X {
|
||||||
public:
|
public:
|
||||||
operator bool();
|
operator bool();
|
||||||
|
@ -133,7 +136,12 @@ private:
|
||||||
|
|
||||||
A1 f() {
|
A1 f() {
|
||||||
// FIXME: redundant diagnostics!
|
// FIXME: redundant diagnostics!
|
||||||
return "Hello"; // expected-error {{calling a private constructor}} expected-warning {{an accessible copy constructor}}
|
return "Hello"; // expected-error {{calling a private constructor}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{an accessible copy constructor}}
|
||||||
|
#else
|
||||||
|
// expected-warning@-4 {{copying parameter of type 'A1' when binding a reference to a temporary would invoke an inaccessible constructor in C++98}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace source_locations {
|
namespace source_locations {
|
||||||
|
@ -175,7 +183,13 @@ namespace crazy_declarators {
|
||||||
(&operator bool())(); // expected-error {{use a typedef to declare a conversion to 'bool (&)()'}}
|
(&operator bool())(); // expected-error {{use a typedef to declare a conversion to 'bool (&)()'}}
|
||||||
*operator int(); // expected-error {{put the complete type after 'operator'}}
|
*operator int(); // expected-error {{put the complete type after 'operator'}}
|
||||||
// No suggestion of using a typedef here; that's not possible.
|
// No suggestion of using a typedef here; that's not possible.
|
||||||
template<typename T> (&operator T())(); // expected-error-re {{cannot specify any part of a return type in the declaration of a conversion function{{$}}}}
|
template<typename T> (&operator T())();
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error-re@-2 {{cannot specify any part of a return type in the declaration of a conversion function{{$}}}}
|
||||||
|
#else
|
||||||
|
// expected-error-re@-4 {{cannot specify any part of a return type in the declaration of a conversion function; use an alias template to declare a conversion to 'T (&)()'{{$}}}}
|
||||||
|
#endif
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,6 +207,10 @@ namespace smart_ptr {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct X { // expected-note{{candidate constructor (the implicit copy constructor) not}}
|
struct X { // expected-note{{candidate constructor (the implicit copy constructor) not}}
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
// expected-note@-2 {{candidate constructor (the implicit move constructor) not}}
|
||||||
|
#endif
|
||||||
|
|
||||||
explicit X(Y);
|
explicit X(Y);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -215,7 +233,12 @@ struct Other {
|
||||||
};
|
};
|
||||||
|
|
||||||
void test_any() {
|
void test_any() {
|
||||||
Any any = Other(); // expected-error{{cannot pass object of non-POD type 'Other' through variadic constructor; call will abort at runtime}}
|
Any any = Other();
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{cannot pass object of non-POD type 'Other' through variadic constructor; call will abort at runtime}}
|
||||||
|
#else
|
||||||
|
// expected-error@-4 {{cannot pass object of non-trivial type 'Other' through variadic constructor; call will abort at runtime}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace PR7055 {
|
namespace PR7055 {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// RUN: %clang_cc1 -verify -fsyntax-only %s -Wno-c++11-extensions -Wno-c++1y-extensions -DPRECXX11
|
// RUN: %clang_cc1 -std=c++98 -verify -fsyntax-only %s -Wno-c++11-extensions -Wno-c++1y-extensions -DPRECXX11
|
||||||
// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only -Wno-c++1y-extensions %s
|
// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only -Wno-c++1y-extensions %s
|
||||||
// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only %s -DCPP1Y
|
// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only %s -DCPP1Y
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// RUN: %clang_cc1 -verify -fsyntax-only -Wno-c++11-extensions -Wno-c++1y-extensions %s -DPRECXX11
|
// RUN: %clang_cc1 -std=c++98 -verify -fsyntax-only -Wno-c++11-extensions -Wno-c++1y-extensions %s -DPRECXX11
|
||||||
// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only -Wno-c++1y-extensions %s
|
// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only -Wno-c++1y-extensions %s
|
||||||
// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only %s
|
// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only %s
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
struct A; // expected-note 4 {{forward declaration of 'A'}}
|
struct A; // expected-note 4 {{forward declaration of 'A'}}
|
||||||
|
|
||||||
|
@ -135,16 +137,29 @@ namespace Decay {
|
||||||
void f() throw (int*, int());
|
void f() throw (int*, int());
|
||||||
|
|
||||||
template<typename T> struct C {
|
template<typename T> struct C {
|
||||||
void f() throw (T); // expected-error {{pointer to incomplete type 'Decay::E' is not allowed in exception specification}}
|
void f() throw (T);
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{pointer to incomplete type 'Decay::E' is not allowed in exception specification}}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
struct D {
|
struct D {
|
||||||
C<D[10]> c;
|
C<D[10]> c;
|
||||||
};
|
};
|
||||||
struct E; // expected-note {{forward declaration}}
|
struct E;
|
||||||
C<E[10]> e; // expected-note {{in instantiation of}}
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{forward declaration of 'Decay::E'}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
C<E[10]> e;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{in instantiation of template class 'Decay::C<Decay::E [10]>' requested here}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void rval_ref() throw (int &&); // expected-error {{rvalue reference type 'int &&' is not allowed in exception specification}} expected-warning {{C++11}}
|
void rval_ref() throw (int &&); // expected-error {{rvalue reference type 'int &&' is not allowed in exception specification}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{rvalue references are a C++11 extension}}
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace HandlerInversion {
|
namespace HandlerInversion {
|
||||||
struct B {};
|
struct B {};
|
||||||
|
|
|
@ -1,9 +1,15 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
namespace A
|
namespace A
|
||||||
{
|
{
|
||||||
namespace B
|
namespace B
|
||||||
{
|
{
|
||||||
struct base // expected-note{{object type}}
|
struct base
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{lookup in the object type 'A::sub' refers here}}
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
void x() {}
|
void x() {}
|
||||||
void y() {}
|
void y() {}
|
||||||
|
@ -85,8 +91,14 @@ namespace C
|
||||||
void fun4a() {
|
void fun4a() {
|
||||||
A::sub *a;
|
A::sub *a;
|
||||||
|
|
||||||
typedef A::member base; // expected-note{{current scope}}
|
typedef A::member base;
|
||||||
a->base::x(); // expected-error{{ambiguous}}
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{lookup from the current scope refers here}}
|
||||||
|
#endif
|
||||||
|
a->base::x();
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{lookup of 'base' in member access expression is ambiguous}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void fun4b() {
|
void fun4b() {
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
// PR4103 : Make sure we don't get a bogus unused expression warning
|
// PR4103 : Make sure we don't get a bogus unused expression warning
|
||||||
namespace PR4103 {
|
namespace PR4103 {
|
||||||
|
@ -28,8 +30,14 @@ namespace PR4103 {
|
||||||
|
|
||||||
namespace derefvolatile {
|
namespace derefvolatile {
|
||||||
void f(volatile char* x) {
|
void f(volatile char* x) {
|
||||||
*x; // expected-warning {{expression result unused; assign into a variable to force a volatile load}}
|
*x;
|
||||||
(void)*x; // expected-warning {{expression result unused; assign into a variable to force a volatile load}}
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{expression result unused; assign into a variable to force a volatile load}}
|
||||||
|
#endif
|
||||||
|
(void)*x;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{expression result unused; assign into a variable to force a volatile load}}
|
||||||
|
#endif
|
||||||
volatile char y = 10;
|
volatile char y = 10;
|
||||||
(void)y; // don't warn here, because it's a common pattern.
|
(void)y; // don't warn here, because it's a common pattern.
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify -Wunused-value %s
|
// RUN: %clang_cc1 -fsyntax-only -verify -Wunused-value %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -Wunused-value -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -Wunused-value -std=c++11 %s
|
||||||
|
|
||||||
// PR4806
|
// PR4806
|
||||||
namespace test0 {
|
namespace test0 {
|
||||||
|
@ -12,7 +14,10 @@ namespace test0 {
|
||||||
// pointer to volatile has side effect (thus no warning)
|
// pointer to volatile has side effect (thus no warning)
|
||||||
Box* box = new Box;
|
Box* box = new Box;
|
||||||
box->i; // expected-warning {{expression result unused}}
|
box->i; // expected-warning {{expression result unused}}
|
||||||
box->j; // expected-warning {{expression result unused}}
|
box->j;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{expression result unused}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void call_f0(T x) {
|
void call_f0(T x) {
|
||||||
x.Base::f0();
|
x.Base::f0();
|
||||||
|
@ -28,15 +31,25 @@ void test_f0_through_typedef(X0 x0) {
|
||||||
|
|
||||||
template<typename TheBase, typename T>
|
template<typename TheBase, typename T>
|
||||||
void call_f0_through_typedef2(T x) {
|
void call_f0_through_typedef2(T x) {
|
||||||
typedef TheBase CrazyBase; // expected-note{{current scope}}
|
typedef TheBase CrazyBase;
|
||||||
x.CrazyBase::f0(); // expected-error{{ambiguous}} \
|
#if __cplusplus <= 199711L
|
||||||
// expected-error 2{{no member named}}
|
// expected-note@-2 {{lookup from the current scope refers here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
x.CrazyBase::f0(); // expected-error 2{{no member named}}
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-error@-2 {{lookup of 'CrazyBase' in member access expression is ambiguous}}
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct OtherBase { };
|
struct OtherBase { };
|
||||||
|
|
||||||
struct X1 : Base, OtherBase {
|
struct X1 : Base, OtherBase {
|
||||||
typedef OtherBase CrazyBase; // expected-note{{object type}}
|
typedef OtherBase CrazyBase;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{lookup in the object type 'X1' refers here}}
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
void test_f0_through_typedef2(X0 x0, X1 x1) {
|
void test_f0_through_typedef2(X0 x0, X1 x1) {
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
// Clang used to crash trying to recover while adding 'this->' before Work(x);
|
// Clang used to crash trying to recover while adding 'this->' before Work(x);
|
||||||
|
|
||||||
|
@ -25,14 +27,20 @@ namespace PR16134 {
|
||||||
|
|
||||||
namespace PR16225 {
|
namespace PR16225 {
|
||||||
template <typename T> void f();
|
template <typename T> void f();
|
||||||
template<typename C> void g(C*) {
|
template <typename C> void g(C*) {
|
||||||
struct LocalStruct : UnknownBase<Mumble, C> { }; // expected-error {{unknown template name 'UnknownBase'}} \
|
struct LocalStruct : UnknownBase<Mumble, C> { }; // expected-error {{unknown template name 'UnknownBase'}} \
|
||||||
// expected-error {{use of undeclared identifier 'Mumble'}}
|
// expected-error {{use of undeclared identifier 'Mumble'}}
|
||||||
f<LocalStruct>(); // expected-warning {{template argument uses local type 'LocalStruct'}}
|
f<LocalStruct>();
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{template argument uses local type 'LocalStruct'}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
struct S;
|
struct S;
|
||||||
void h() {
|
void h() {
|
||||||
g<S>(0); // expected-note {{in instantiation of function template specialization}}
|
g<S>(0);
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{in instantiation of function template specialization}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
||||||
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||||
|
|
||||||
template<typename T> class A; // expected-note 2 {{template parameter is declared here}} expected-note{{template is declared here}}
|
template<typename T> class A; // expected-note 2 {{template parameter is declared here}} expected-note{{template is declared here}}
|
||||||
|
|
||||||
// [temp.arg.type]p1
|
// [temp.arg.type]p1
|
||||||
|
@ -24,11 +27,21 @@ A<ns::B> a8; // expected-error{{use of class template 'ns::B' requires template
|
||||||
// [temp.arg.type]p2
|
// [temp.arg.type]p2
|
||||||
void f() {
|
void f() {
|
||||||
class X { };
|
class X { };
|
||||||
A<X> * a = 0; // expected-warning{{template argument uses local type 'X'}}
|
A<X> * a = 0;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{template argument uses local type 'X'}}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
struct { int x; } Unnamed; // expected-note{{unnamed type used in template argument was declared here}}
|
struct { int x; } Unnamed;
|
||||||
A<__typeof__(Unnamed)> *a9; // expected-warning{{template argument uses unnamed type}}
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-note@-2 {{unnamed type used in template argument was declared here}}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
A<__typeof__(Unnamed)> *a9;
|
||||||
|
#if __cplusplus <= 199711L
|
||||||
|
// expected-warning@-2 {{template argument uses unnamed type}}
|
||||||
|
#endif
|
||||||
|
|
||||||
template<typename T, unsigned N>
|
template<typename T, unsigned N>
|
||||||
struct Array {
|
struct Array {
|
||||||
|
|
Loading…
Reference in New Issue