1 // RUN: %clang_cc1 -x c++ -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s
2 // RUN: %clang_cc1 -x c++ -fsanitize=pointer-overflow -fno-sanitize-recover=pointer-overflow -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s
3
4 #include <stdint.h>
5
6 struct S {
7 int x, y;
8 };
9
10 // CHECK-LABEL: define i64 @{{.*}}get_offset_of_y_naively{{.*}}(
get_offset_of_y_naively()11 uintptr_t get_offset_of_y_naively() {
12 // CHECK: [[ENTRY:.*]]:
13 // CHECK-NEXT: ret i64 ptrtoint (i32* getelementptr (i32, i32* null, i32 1) to i64)
14 // CHECK-NEXT: }
15 return ((uintptr_t)(&(((S *)nullptr)->y)));
16 }
17
18 // CHECK-LABEL: define i64 @{{.*}}get_offset_of_y_via_builtin{{.*}}(
get_offset_of_y_via_builtin()19 uintptr_t get_offset_of_y_via_builtin() {
20 // CHECK: [[ENTRY:.*]]:
21 // CHECK-NEXT: ret i64 4
22 // CHECK-NEXT: }
23 return __builtin_offsetof(S, y);
24 }
25