brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 6a0d626 Raw
96 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py2// RUN: %clang_cc1 -x c++ -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s3// RUN: %clang_cc1 -x c++ -fsanitize=pointer-overflow -fno-sanitize-recover=pointer-overflow -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s4 5#include <stdint.h>6 7struct S {8  int x, y;9};10 11// CHECK-LABEL: @_Z23get_offset_of_y_naivelyv(12// CHECK-NEXT:  entry:13// CHECK-NEXT:    ret i64 ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr null, i32 0, i32 1) to i64)14//15uintptr_t get_offset_of_y_naively() {16  return ((uintptr_t)(&(((S *)nullptr)->y)));17}18 19struct Empty {};20 21struct T {22  int a;23  S s;24  [[no_unique_address]] Empty e1;25  int b;26  [[no_unique_address]] Empty e2;27};28 29// CHECK-LABEL: @_Z30get_offset_of_y_naively_nestedv(30// CHECK-NEXT:  entry:31// CHECK-NEXT:    ret i64 ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr getelementptr ([[STRUCT_T:%.*]], ptr null, i32 0, i32 1), i32 0, i32 1) to i64)32//33uintptr_t get_offset_of_y_naively_nested() {34  return ((uintptr_t)(&(((T *)nullptr)->s.y)));35}36 37// CHECK-LABEL: @_Z42get_offset_of_y_naively_nested_with_parensv(38// CHECK-NEXT:  entry:39// CHECK-NEXT:    ret i64 ptrtoint (ptr getelementptr ([[STRUCT_S:%.*]], ptr getelementptr ([[STRUCT_T:%.*]], ptr null, i32 0, i32 1), i32 0, i32 1) to i64)40//41uintptr_t get_offset_of_y_naively_nested_with_parens() {42  return ((uintptr_t)(&((((T *)nullptr)->s).y)));43}44 45// CHECK-LABEL: @_Z26get_offset_of_zero_storagev(46// CHECK-NEXT:  entry:47// CHECK-NEXT:    ret i64 ptrtoint (ptr getelementptr (i8, ptr null, i64 16) to i64)48//49uintptr_t get_offset_of_zero_storage() {50  return ((uintptr_t)(&(((T *)nullptr)->e2)));51}52 53namespace 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//58uintptr_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//66uintptr_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//74uintptr_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 881// CHECK-NEXT:    store ptr null, ptr [[NULL]], align 882// CHECK-NEXT:    ret i64 ptrtoint (ptr getelementptr inbounds nuw ([[STRUCT_S:%.*]], ptr null, i32 0, i32 1) to i64)83//84uintptr_t get_offset_of_y_nullptr_constant() {85  constexpr void *null = nullptr;86  return ((uintptr_t)(&(((S *)null)->y)));87}88 89// CHECK-LABEL: @_Z27get_offset_of_y_via_builtinv(90// CHECK-NEXT:  entry:91// CHECK-NEXT:    ret i64 492//93uintptr_t get_offset_of_y_via_builtin() {94  return __builtin_offsetof(S, y);95}96