Home | History | Annotate | Download | only in SemaCXX
      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