1 // RUN: %clang_cc1 -fsyntax-only -Wno-error=address-of-temporary -verify -std=gnu++11 %s 2 struct X { 3 X(); 4 X(int); 5 X(int, int); 6 }; 7 8 void f0() { (void)&X(); } // expected-warning{{taking the address of a temporary object}} 9 void f1() { (void)&X(1); } // expected-warning{{taking the address of a temporary object}} 10 void f2() { (void)&X(1, 2); } // expected-warning{{taking the address of a temporary object}} 11 void f3() { (void)&(X)1; } // expected-warning{{taking the address of a temporary object}} 12 13 14 namespace PointerToArrayDecay { 15 struct Y { 16 int a[4]; 17 }; 18 struct Z { 19 int n; 20 ~Z(); 21 }; 22 23 typedef int A[4]; 24 typedef Z AZ[4]; 25 26 template<typename T> void consume(T); 27 struct S { int *p; }; 28 29 void g0() { int *p = Y().a; } // expected-warning{{pointer is initialized by a temporary array}} 30 void g1() { int *p = Y{}.a; } // expected-warning{{pointer is initialized by a temporary array}} 31 void g2() { int *p = A{}; } // expected-warning{{pointer is initialized by a temporary array}} 32 void g3() { int *p = (A){}; } // expected-warning{{pointer is initialized by a temporary array}} 33 void g4() { Z *p = AZ{}; } // expected-warning{{pointer is initialized by a temporary array}} 34 35 void h0() { consume(Y().a); } 36 void h1() { consume(Y{}.a); } 37 void h2() { consume(A{}); } 38 void h3() { consume((A){}); } 39 void h4() { consume(AZ{}); } 40 41 void i0() { S s = { Y().a }; } // expected-warning{{pointer is initialized by a temporary array}} 42 void i1() { S s = { Y{}.a }; } // expected-warning{{pointer is initialized by a temporary array}} 43 void i2() { S s = { A{} }; } // expected-warning{{pointer is initialized by a temporary array}} 44 void i3() { S s = { (A){} }; } // expected-warning{{pointer is initialized by a temporary array}} 45 46 void j0() { (void)S { Y().a }; } 47 void j1() { (void)S { Y{}.a }; } 48 void j2() { (void)S { A{} }; } 49 void j3() { (void)S { (A){} }; } 50 51 void k0() { consume(S { Y().a }); } 52 void k1() { consume(S { Y{}.a }); } 53 void k2() { consume(S { A{} }); } 54 void k3() { consume(S { (A){} }); } 55 } 56