1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-pc-win32 -emit-llvm -O2 -o - %s | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li // Under Windows 64, int and long are 32-bits. Make sure pointer math doesn't 4*67e74705SXin Li // cause any sign extensions. 5*67e74705SXin Li 6*67e74705SXin Li // CHECK: [[P:%.*]] = add i64 %param, -8 7*67e74705SXin Li // CHECK-NEXT: [[Q:%.*]] = inttoptr i64 [[P]] to [[R:%.*]]* 8*67e74705SXin Li // CHECK-NEXT: {{%.*}} = getelementptr inbounds [[R]], [[R]]* [[Q]], i64 0, i32 0 9*67e74705SXin Li 10*67e74705SXin Li #define CR(Record, TYPE, Field) \ 11*67e74705SXin Li ((TYPE *) ((unsigned char *) (Record) - (unsigned char *) &(((TYPE *) 0)->Field))) 12*67e74705SXin Li 13*67e74705SXin Li typedef struct _LIST_ENTRY { 14*67e74705SXin Li struct _LIST_ENTRY *ForwardLink; 15*67e74705SXin Li struct _LIST_ENTRY *BackLink; 16*67e74705SXin Li } LIST_ENTRY; 17*67e74705SXin Li 18*67e74705SXin Li typedef struct { 19*67e74705SXin Li unsigned long long Signature; 20*67e74705SXin Li LIST_ENTRY Link; 21*67e74705SXin Li } MEMORY_MAP; 22*67e74705SXin Li test(unsigned long long param)23*67e74705SXin Liint test(unsigned long long param) 24*67e74705SXin Li { 25*67e74705SXin Li LIST_ENTRY *Link; 26*67e74705SXin Li MEMORY_MAP *Entry; 27*67e74705SXin Li 28*67e74705SXin Li Link = (LIST_ENTRY *) param; 29*67e74705SXin Li 30*67e74705SXin Li Entry = CR (Link, MEMORY_MAP, Link); 31*67e74705SXin Li return (int) Entry->Signature; 32*67e74705SXin Li } 33