brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 16c8ce9 Raw
77 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -verify=expected,expected11,both,both11 %s -fexperimental-new-constant-interpreter2// RUN: %clang_cc1 -std=c++14 -verify=expected,expected14,both        %s -fexperimental-new-constant-interpreter3// RUN: %clang_cc1 -std=c++11 -verify=ref,ref11,both,both11           %s4// RUN: %clang_cc1 -std=c++14 -verify=ref,ref14,both                  %s5 6namespace Simple {7  struct S {8    mutable int a; // both-note {{declared here}} \9                   // both11-note {{declared here}}10    int a2;11  };12 13  constexpr S s{12, 24};14  static_assert(s.a == 12, ""); // both-error {{not an integral constant expression}}  \15                                // both-note {{read of mutable member 'a'}}16  static_assert(s.a2 == 24, "");17 18 19  constexpr S s2{12, s2.a}; // both11-error {{must be initialized by a constant expression}} \20                            // both11-note {{read of mutable member 'a'}} \21                            // both11-note {{declared here}}22  static_assert(s2.a2 == 12, ""); // both11-error {{not an integral constant expression}} \23                                  // both11-note {{initializer of 's2' is not a constant expression}}24}25#if __cplusplus >= 201402L26namespace ConstInMutable {27  class B {28    public:29 30    const int f;31    constexpr B() : f(12) {}32  };33  class A {34    public:35    mutable B b;36    constexpr A() = default;37  };38  constexpr int constInMutable() {39    A a;40 41    int *m = (int*)&a.b.f;42    *m = 12; // both-note {{modification of object of const-qualified type 'const int' is not allowed in a constant expression}}43    return 1;44  }45  static_assert(constInMutable() == 1, ""); // both-error {{not an integral constant expression}} \46                                            // both-note {{in call to}}47}48 49namespace MutableInConst {50  class C {51  public:52    mutable int c;53    constexpr C() : c(50) {}54  };55  class D {56  public:57    C c;58    constexpr D() {}59  };60  constexpr int mutableInConst() {61    const D d{};62    int *m = (int*)&d.c.c;63    *m = 12;64    return 1;65  }66  static_assert(mutableInConst() == 1, "");67}68#endif69 70struct D { mutable int y; }; // both-note {{declared here}}71constexpr D d1 = { 1 };72constexpr D d2 = d1; // both-error {{must be initialized by a constant expression}} \73                     // both-note {{read of mutable member 'y}} \74                     // both-note {{in call to}}75 76 77