xref: /llvm-project/clang/test/CodeGenCXX/nullptr.cpp (revision d8f0611acc2658ccc54d985044aa115716c6ad34)
1 // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -I%S -emit-llvm -o - %s | FileCheck %s
2 // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-darwin10 -I%S -emit-llvm -o - %s -fexperimental-new-constant-interpreter | FileCheck %s
3 
4 #include <typeinfo>
5 
6 // CHECK: @_ZTIDn = external constant ptr
7 int* a = nullptr;
8 
9 void f() {
10   int* a = nullptr;
11 }
12 
13 typedef decltype(nullptr) nullptr_t;
14 
15 nullptr_t get_nullptr();
16 
17 struct X { };
18 void g() {
19   // CHECK: call ptr @_Z11get_nullptrv()
20   int (X::*pmf)(int) = get_nullptr();
21 }
22 
23 const std::type_info& f2() {
24   return typeid(nullptr_t);
25 }
26 
27 union U {
28   int n;
29   nullptr_t b;
30 };
31 // CHECK-LABEL: define {{.*}}pr23833_a
32 // CHECK: store
33 // CHECK: load
34 // CHECK-NOT: load
35 // CHECK: ret i1 false
36 bool pr23833_a(U &u) { return bool(u.b); }
37 
38 // CHECK-LABEL: define {{.*}}pr23833_b
39 // CHECK: store
40 // CHECK: load
41 // CHECK-NOT: load
42 // CHECK: ret ptr null
43 nullptr_t pr23833_b(nullptr_t &n) { return n; }
44 
45 struct X1 { operator int*(); };
46 struct X2 { operator const nullptr_t&(); };
47 
48 // CHECK-LABEL: define {{.*}}pr23833_c
49 // CHECK: call {{.*}}X1
50 // CHECK: call {{.*}}X2
51 // CHECK-NOT: load
52 // CHECK: ret i32
53 int pr23833_c() {
54   return X1() != X2();
55 }
56 
57 // CHECK-LABEL: define {{.*}}pr23833_d
58 // CHECK: call {{.*}}X2
59 // CHECK-NOT: load
60 // CHECK: store
61 // CHECK: load
62 // CHECK: ret ptr
63 int *pr23833_d() {
64   int *p = X2();
65   return p;
66 }
67 
68 namespace PR39528 {
69   constexpr nullptr_t null = nullptr;
70   void f(nullptr_t);
71   void g() { f(null); }
72 }
73