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