brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.9 KiB · c8695fb Raw
463 lines · cpp
1// RUN: %clang_cc1 -std=gnu++2a -emit-pch %s -o %t.pch2// RUN: %clang_cc1 -std=gnu++2a %s -DEMIT -ast-merge %t.pch -ast-dump-all | FileCheck %s3 4// XFAIL: *5 6#ifndef EMIT7#define EMIT8 9namespace Integer {10 11consteval int fint() {12  return 6789;13}14 15int Unique_Int = fint();16//CHECK:      VarDecl {{.*}} Unique_Int17//CHECK-NEXT: ConstantExpr {{.*}} 'int'18//CHECK-NEXT: value: Int 678919 20consteval __uint128_t fint128() {21  return ((__uint128_t)0x75f17d6b3588f843 << 64) | 0xb13dea7c9c324e51;22}23 24constexpr __uint128_t Unique_Int128 = fint128();25//CHECK:      VarDecl {{.*}} Unique_Int12826//CHECK-NEXT: value: Int 15677356284492418790089849634369216878527//CHECK-NEXT: ConstantExpr28//CHECK-NEXT: value: Int 15677356284492418790089849634369216878529 30} // namespace Integer31 32namespace FloatingPoint {33 34consteval double fdouble() {35  return double(567890.67890);36}37 38double Unique_Double = fdouble();39//CHECK:      VarDecl {{.*}} Unique_Double40//CHECK-NEXT: ConstantExpr {{.*}}41//CHECK-NEXT: value: Float 5.678907e+0542 43} // namespace FloatingPoint44 45// FIXME: Add test for FixedPoint, ComplexInt, ComplexFloat, AddrLabelDiff.46 47namespace Struct {48 49struct B {50  int i;51  double d;52};53 54consteval B fB() {55  return B{1, 0.7};56}57 58constexpr B Basic_Struct = fB();59//CHECK:      VarDecl {{.*}} Basic_Struct60//CHECK-NEXT: value: Struct61//CHECK-NEXT: fields: Int 1, Float 7.000000e-0162//CHECK-NEXT: ImplicitCastExpr63//CHECK-NEXT: ConstantExpr64//CHECK-NEXT: value: Struct65//CHECK-NEXT: fields: Int 1, Float 7.000000e-0166 67struct C {68  int i = 9;69};70 71struct A : B {72  constexpr A(B b, int I, double D, C _c) : B(b), i(I), d(D), c(_c) {}73  int i;74  double d;75  C c;76};77 78consteval A fA() {79  return A(Basic_Struct, 1, 79.789, {});80}81 82A Advanced_Struct = fA();83//CHECK:      VarDecl {{.*}} Advanced_Struct84//CHECK-NEXT: ConstantExpr {{.*}}85//CHECK-NEXT: value: Struct86//CHECK-NEXT: base: Struct87//CHECK-NEXT: fields: Int 1, Float 7.000000e-0188//CHECK-NEXT: fields: Int 1, Float 7.978900e+0189//CHECK-NEXT: field: Struct90//CHECK-NEXT: field: Int 991 92} // namespace Struct93 94namespace Vector {95 96using v4si = int __attribute__((__vector_size__(16)));97 98consteval v4si fv4si() {99  return (v4si){8, 2, 3};100}101 102v4si Vector_Int = fv4si();103//CHECK:      VarDecl {{.*}} Vector_Int104//CHECK-NEXT: ConstantExpr105//CHECK-NEXT: value: Vector length=4106//CHECK-NEXT: elements: Int 8, Int 2, Int 3, Int 0107 108} // namespace Vector109 110namespace Array {111 112struct B {113  int arr[6];114};115 116consteval B fint() {117  return B{1, 2, 3, 4, 5, 6};118}119 120B Array_Int = fint();121//CHECK:      VarDecl {{.*}} Array_Int122//CHECK-NEXT: ConstantExpr123//CHECK-NEXT: value: Struct124//CHECK-NEXT: field: Array size=6125//CHECK-NEXT: elements: Int 1, Int 2, Int 3, Int 4126//CHECK-NEXT: elements: Int 5, Int 6127 128struct A {129  int i = 789;130  double d = 67890.09876;131};132 133struct C {134  A arr[3];135};136 137consteval C fA() {138  return {{A{}, A{-45678, 9.8}, A{9}}};139}140 141C Array2_Struct = fA();142//CHECK:      VarDecl {{.*}} Array2_Struct143//CHECK-NEXT: ConstantExpr {{.*}}144 145using v4si = int __attribute__((__vector_size__(16)));146 147struct D {148  v4si arr[2];149};150 151consteval D fv4si() {152  return {{{1, 2, 3, 4}, {4, 5, 6, 7}}};153}154 155D Array_Vector = fv4si();156//CHECK:      VarDecl {{.*}} Array_Vector157//CHECK-NEXT: ConstantExpr {{.*}}158//CHECK-NEXT: value: Struct159//CHECK-NEXT: field: Array size=2160//CHECK-NEXT: element: Vector length=4161//CHECK-NEXT: elements: Int 1, Int 2, Int 3, Int 4162//CHECK-NEXT: element: Vector length=4163//CHECK-NEXT: elements: Int 4, Int 5, Int 6, Int 7164 165} // namespace Array166 167namespace Union {168 169struct A {170  int i = 6789;171  float f = 987.9876;172};173 174union U {175  int i;176  A a{567890, 9876.5678f};177};178 179consteval U fU1() {180  return U{0};181}182 183U Unique_Union1 = fU1();184//CHECK:      VarDecl {{.*}} Unique_Union185//CHECK-NEXT: ConstantExpr186//CHECK-NEXT: value: Union .i Int 0187 188consteval U fU() {189  return U{};190}191 192U Unique_Union2 = fU();193//CHECK:      VarDecl {{.*}} Unique_Union194//CHECK-NEXT: ConstantExpr195//CHECK-NEXT: value: Union .a196//CHECK-NEXT: Struct197//CHECK-NEXT: fields: Int 567890, Float 9.876567e+03198 199} // namespace Union200 201namespace MemberPointer {202 203struct A {204  struct B {205    struct C {206      struct D {207        struct E {208          struct F {209            struct G {210              int i;211            };212          };213        };214      };215    };216  };217};218 219consteval auto fmem_ptr() -> decltype(&A::B::C::D::E::F::G::i) {220  return &A::B::C::D::E::F::G::i;221}222 223auto MemberPointer1 = fmem_ptr();224//CHECK:      VarDecl {{.*}} MemberPointer1225//CHECK-NEXT: ConstantExpr226//CHECK-NEXT: value: MemberPointer &G::i227 228struct A1 {229  struct B1 {230    int f() const {231      return 0;232    }233  };234};235 236consteval auto fmem_ptr2() {237  return &A1::B1::f;238}239 240auto MemberPointer2 = fmem_ptr2();241//CHECK:      VarDecl {{.*}} MemberPointer2242//CHECK-NEXT: ConstantExpr243//CHECK-NEXT: value: MemberPointer &B1::f244 245} // namespace MemberPointer246 247namespace std {248struct type_info;249};250 251namespace LValue {252 253constexpr int g = 0;254 255consteval const int &fg_ref() {256  return g;257}258 259const int &g_ref = fg_ref();260//CHECK:      VarDecl {{.*}} g_ref261//CHECK-NEXT: ConstantExpr262//CHECK-NEXT: value: LValue &g263 264consteval const int *fint_ptr() {265  return &g;266}267 268const int *g_ptr = fint_ptr();269//CHECK:      VarDecl {{.*}} g_ptr270//CHECK-NEXT: ConstantExpr271//CHECK-NEXT: value: LValue &g272 273consteval const int *fnull_ptr() {274  return nullptr;275}276 277const int *ptr2 = fnull_ptr();278//CHECK:      VarDecl {{.*}} ptr2279//CHECK-NEXT: ConstantExpr280//CHECK-NEXT: value: LValue nullptr281 282int fconst();283 284consteval auto ffunc_ptr() {285  return &fconst;286}287 288int (*func_ptr)() = ffunc_ptr();289//CHECK:      VarDecl {{.*}} func_ptr290//CHECK-NEXT: ConstantExpr {{.*}}291//CHECK-NEXT: value: LValue &fconst292 293struct A {294  int Arr[6] = {0, 1, 3, 4, 5, 9};295  int i = 0;296};297 298struct D {299  A arr[6] = {};300};301 302consteval D fA() {303  return {};304}305 306constexpr D Arr = fA();307// CHECK:      VarDecl {{.*}} Arr308// CHECK-NEXT: value: Struct309// CHECK-NEXT: field: Array size=6310// CHECK-NEXT: element: Struct311// CHECK-NEXT: field: Array size=6312// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4313// CHECK-NEXT: elements: Int 5, Int 9314// CHECK-NEXT: field: Int 0315// CHECK-NEXT: element: Struct316// CHECK-NEXT: field: Array size=6317// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4318// CHECK-NEXT: elements: Int 5, Int 9319// CHECK-NEXT: field: Int 0320// CHECK-NEXT: element: Struct321// CHECK-NEXT: field: Array size=6322// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4323// CHECK-NEXT: elements: Int 5, Int 9324// CHECK-NEXT: field: Int 0325// CHECK-NEXT: element: Struct326// CHECK-NEXT: field: Array size=6327// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4328// CHECK-NEXT: elements: Int 5, Int 9329// CHECK-NEXT: field: Int 0330// CHECK-NEXT: element: Struct331// CHECK-NEXT: field: Array size=6332// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4333// CHECK-NEXT: elements: Int 5, Int 9334// CHECK-NEXT: field: Int 0335// CHECK-NEXT: element: Struct336// CHECK-NEXT: field: Array size=6337// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4338// CHECK-NEXT: elements: Int 5, Int 9339// CHECK-NEXT: field: Int 0340// CHECK-NEXT: ImplicitCastExpr341// CHECK-NEXT: ConstantExpr342// CHECK-NEXT: value: Struct343// CHECK-NEXT: field: Array size=6344// CHECK-NEXT: element: Struct345// CHECK-NEXT: field: Array size=6346// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4347// CHECK-NEXT: elements: Int 5, Int 9348// CHECK-NEXT: field: Int 0349// CHECK-NEXT: element: Struct350// CHECK-NEXT: field: Array size=6351// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4352// CHECK-NEXT: elements: Int 5, Int 9353// CHECK-NEXT: field: Int 0354// CHECK-NEXT: element: Struct355// CHECK-NEXT: field: Array size=6356// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4357// CHECK-NEXT: elements: Int 5, Int 9358// CHECK-NEXT: field: Int 0359// CHECK-NEXT: element: Struct360// CHECK-NEXT: field: Array size=6361// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4362// CHECK-NEXT: elements: Int 5, Int 9363// CHECK-NEXT: field: Int 0364// CHECK-NEXT: element: Struct365// CHECK-NEXT: field: Array size=6366// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4367// CHECK-NEXT: elements: Int 5, Int 9368// CHECK-NEXT: field: Int 0369// CHECK-NEXT: element: Struct370// CHECK-NEXT: field: Array size=6371// CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4372// CHECK-NEXT: elements: Int 5, Int 9373// CHECK-NEXT: field: Int 0374 375consteval const int &fconstintref() {376  return Arr.arr[0].i;377}378 379const int &ArrayStructRef1 = fconstintref();380//CHECK:      VarDecl {{.*}} ArrayStructRef1381//CHECK-NEXT: ConstantExpr382//CHECK-NEXT: value: LValue &Arr.arr[0].i383 384consteval const int &fconstintref2() {385  return Arr.arr[1].Arr[5];386}387 388const int &ArrayStructRef2 = fconstintref2();389//CHECK:      VarDecl {{.*}} ArrayStructRef2390//CHECK-NEXT: ConstantExpr391//CHECK-NEXT: value: LValue &Arr.arr[1].Arr[5]392 393consteval const int *fconststar() {394  return &ArrayStructRef2;395}396 397const int *ArrayStructRef3 = fconststar();398//CHECK:      VarDecl {{.*}} ArrayStructRef3399//CHECK-NEXT: ConstantExpr400//CHECK-NEXT: value: LValue  &Arr.arr[1].Arr[5]401 402struct B : A {403};404 405struct C {406  B b;407};408 409consteval C fC() {410  return {};411}412 413C c = fC();414//CHECK:      VarDecl {{.*}} c415//CHECK-NEXT: ConstantExpr416//CHECK-NEXT: value: Struct417//CHECK-NEXT: field: Struct418//CHECK-NEXT: base: Struct419//CHECK-NEXT: field: Array size=6420//CHECK-NEXT: elements: Int 0, Int 1, Int 3, Int 4421//CHECK-NEXT: elements: Int 5, Int 9422//CHECK-NEXT: field: Int 0423 424consteval const int &f2constintref() {425  return c.b.i;426}427 428const int &StructPathRef = f2constintref();429//CHECK:      VarDecl {{.*}} StructPathRef430//CHECK-NEXT: ConstantExpr431//CHECK-NEXT: value: LValue &c.b.A::i432 433consteval const std::type_info *ftype_info() {434  return &typeid(c);435}436 437const std::type_info *T1 = ftype_info();438//CHECK:      VarDecl {{.*}} T1439//CHECK-NEXT: ConstantExpr440//CHECK-NEXT:value: LValue &typeid(LValue::C)441 442consteval const std::type_info *ftype_info2() {443  return &typeid(Arr.arr[1].Arr[2]);444}445 446const std::type_info *T2 = ftype_info2();447//CHECK:      VarDecl {{.*}} T2448//CHECK-NEXT: ConstantExpr449//CHECK-NEXT: value: LValue &typeid(int)450 451consteval const char *fstring() {452  return "test";453}454 455const char *cptr = fstring();456//CHECK:      VarDecl {{.*}} cptr457//CHECK-NEXT: ConstantExpr458//CHECK-NEXT: value: LValue &"test"[0]459 460} // namespace LValue461 462#endif463