@@ -50,6 +50,42 @@ uintptr_t get_offset_of_zero_storage() {
50
50
return ((uintptr_t )(&(((T *)nullptr )->e2 )));
51
51
}
52
52
53
+ namespace std { typedef decltype (__nullptr) nullptr_t; }
54
+ // CHECK-LABEL: @_Z29get_offset_of_y_integral_zerov(
55
+ // CHECK-NEXT: entry:
56
+ // CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr null, i32 0, i32 1) to i64)
57
+ //
58
+ uintptr_t get_offset_of_y_integral_zero () {
59
+ return ((uintptr_t )(&(((S *)0 )->y )));
60
+ }
61
+
62
+ // CHECK-LABEL: @_Z37get_offset_of_y_integral_zero_voidptrv(
63
+ // CHECK-NEXT: entry:
64
+ // CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr null, i32 0, i32 1) to i64)
65
+ //
66
+ uintptr_t get_offset_of_y_integral_zero_voidptr () {
67
+ return ((uintptr_t )(&(((S *)(void *)0 )->y )));
68
+ }
69
+
70
+ // CHECK-LABEL: @_Z25get_offset_of_y_nullptr_tv(
71
+ // CHECK-NEXT: entry:
72
+ // CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr null, i32 0, i32 1) to i64)
73
+ //
74
+ uintptr_t get_offset_of_y_nullptr_t () {
75
+ return ((uintptr_t )(&(((S *)std::nullptr_t {})->y )));
76
+ }
77
+
78
+ // CHECK-LABEL: @_Z32get_offset_of_y_nullptr_constantv(
79
+ // CHECK-NEXT: entry:
80
+ // CHECK-NEXT: [[NULL:%.*]] = alloca ptr, align 8
81
+ // CHECK-NEXT: store ptr null, ptr [[NULL]], align 8
82
+ // CHECK-NEXT: ret i64 ptrtoint (ptr getelementptr inbounds nuw ([[STRUCT_S:%.*]], ptr null, i32 0, i32 1) to i64)
83
+ //
84
+ uintptr_t get_offset_of_y_nullptr_constant () {
85
+ constexpr void *null = nullptr ;
86
+ return ((uintptr_t )(&(((S *)null)->y )));
87
+ }
88
+
53
89
// CHECK-LABEL: @_Z27get_offset_of_y_via_builtinv(
54
90
// CHECK-NEXT: entry:
55
91
// CHECK-NEXT: ret i64 4
0 commit comments