Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -std=c++1y %s -verify
      2 
      3 namespace in_class_init {
      4   union U { char c; double d = 4.0; };
      5   constexpr U u1 = U();
      6   constexpr U u2 {};
      7   constexpr U u3 { 'x' };
      8   static_assert(u1.d == 4.0, "");
      9   static_assert(u2.d == 4.0, "");
     10   static_assert(u3.c == 'x', "");
     11 
     12   struct A {
     13     int n = 5;
     14     int m = n * 3;
     15     union {
     16       char c;
     17       double d = 4.0;
     18     };
     19   };
     20   constexpr A a1 {};
     21   constexpr A a2 { 8 };
     22   constexpr A a3 { 1, 2, { 3 } };
     23   constexpr A a4 { 1, 2, { .d = 3.0 } };
     24   static_assert(a1.d == 4.0, "");
     25   static_assert(a2.m == 24, "");
     26   static_assert(a2.d == 4.0, "");
     27   static_assert(a3.c == 3, "");
     28   static_assert(a3.d == 4.0, ""); // expected-error {{constant expression}} expected-note {{active member 'c'}}
     29   static_assert(a4.d == 3.0, "");
     30 
     31   struct B {
     32     int n;
     33     constexpr int f() { return n * 5; }
     34     int m = f();
     35   };
     36   B b1 {};
     37   constexpr B b2 { 2 };
     38   B b3 { 1, 2 };
     39   static_assert(b2.m == 10, "");
     40 
     41   struct C {
     42     int k;
     43     union {
     44       int l = k; // expected-error {{invalid use of non-static}}
     45     };
     46   };
     47 }
     48 
     49 namespace nested_aggregate_init {
     50   struct A {
     51     int n = 5;
     52     int b = n * 3;
     53   };
     54   struct B {
     55     constexpr B(int k) : d(1.23), k(k) {}
     56     // Within this aggregate, both this object's 'this' and the temporary's
     57     // 'this' are used.
     58     constexpr int f() const { return A{k}.b; }
     59     double d;
     60     int k;
     61   };
     62   static_assert(B(6).f() == 18, "");
     63 }
     64