File: type-aware-new-constexpr.cpp

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,235,796 kB
  • sloc: cpp: 7,617,614; ansic: 1,433,901; asm: 1,058,726; python: 252,096; f90: 94,671; objc: 70,753; lisp: 42,813; pascal: 18,401; sh: 10,032; ml: 5,111; perl: 4,720; awk: 3,523; makefile: 3,401; javascript: 2,272; xml: 892; fortran: 770
file content (56 lines) | stat: -rw-r--r-- 2,273 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// RUN: %clang_cc1 %s -triple arm64-apple-macosx     -fsized-deallocation    -faligned-allocation -emit-llvm -fcxx-exceptions -fexceptions -std=c++26 -o - | FileCheck %s
// RUN: %clang_cc1 %s -triple arm64-apple-macosx  -fno-sized-deallocation    -faligned-allocation -emit-llvm -fcxx-exceptions -fexceptions -std=c++26 -o - | FileCheck %s
// RUN: %clang_cc1 %s -triple arm64-apple-macosx  -fno-sized-deallocation -fno-aligned-allocation -emit-llvm -fcxx-exceptions -fexceptions -std=c++26 -o - | FileCheck %s
// RUN: %clang_cc1 %s -triple arm64-apple-macosx     -fsized-deallocation -fno-aligned-allocation -emit-llvm -fcxx-exceptions -fexceptions -std=c++26 -o - | FileCheck %s
// RUN: %clang_cc1 %s -triple arm64-apple-macosx -faligned-allocation                             -emit-llvm -fcxx-exceptions -fexceptions -std=c++26 -fexperimental-new-constant-interpreter -o - | FileCheck %s

using size_t = __SIZE_TYPE__;

namespace std {
  template <class T> struct type_identity {
    typedef T type;
  };
  enum class align_val_t : size_t {};
}


template <typename T> void *operator new(std::type_identity<T>, size_t, std::align_val_t);
template <typename T> void operator delete(std::type_identity<T>, void *, size_t, std::align_val_t);
struct S {
  int i = 0;
  constexpr S() __attribute__((noinline)) {}
};

 constexpr int doSomething() {
  S* s = new S;
  int result = s->i;
  delete s;
  return result;
}

static constexpr int force_doSomething = doSomething();
template <int N> struct Tag {};

void test1(Tag<force_doSomething>){
// CHECK-LABEL: define void @_Z5test13TagILi0EE
}

void test2(Tag<doSomething() + 1>){
// CHECK-LABEL: define void @_Z5test23TagILi1EE
}

int main() {
  // CHECK-LABEL: define noundef i32 @main()
  return doSomething();
  // CHECK: call{{.*}}i32 @_Z11doSomethingv()
}

// CHECK-LABEL: define linkonce_odr noundef i32 @_Z11doSomethingv()
// CHECK: [[ALLOC:%.*]] = call noundef ptr @_ZnwI1SEPvSt13type_identityIT_Em
// CHECK: invoke noundef ptr @_ZN1SC1Ev(ptr{{.*}} [[ALLOC]])
// CHECK-NEXT: to label %[[CONT:.*]] unwind label %[[LPAD:[a-z0-9]+]]
// CHECK: [[CONT]]:
// CHECK: call void @_ZdlI1SEvSt13type_identityIT_EPv
// CHECK: ret
// CHECK: [[LPAD]]:
// call void @_ZdlI1SEvSt13type_identityIT_EPvmSt11align_val_t({{.*}} [[ALLOC]])