xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGenCXX/arm64-empty-struct.cpp (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -triple arm64-apple-ios -target-abi darwinpcs -emit-llvm -o - %s | FileCheck %s
2*0a6a1f1dSLionel Sambuc struct Empty {};
3*0a6a1f1dSLionel Sambuc 
4*0a6a1f1dSLionel Sambuc Empty emptyvar;
5*0a6a1f1dSLionel Sambuc 
take_args(int a,...)6*0a6a1f1dSLionel Sambuc int take_args(int a, ...) {
7*0a6a1f1dSLionel Sambuc   __builtin_va_list l;
8*0a6a1f1dSLionel Sambuc   __builtin_va_start(l, a);
9*0a6a1f1dSLionel Sambuc // CHECK: call void @llvm.va_start
10*0a6a1f1dSLionel Sambuc 
11*0a6a1f1dSLionel Sambuc   emptyvar = __builtin_va_arg(l, Empty);
12*0a6a1f1dSLionel Sambuc // CHECK: load i8**
13*0a6a1f1dSLionel Sambuc // CHECK-NOT: getelementptr
14*0a6a1f1dSLionel Sambuc // CHECK: [[EMPTY_PTR:%[a-zA-Z0-9._]+]] = bitcast i8* {{%[a-zA-Z0-9._]+}} to %struct.Empty*
15*0a6a1f1dSLionel Sambuc 
16*0a6a1f1dSLionel Sambuc   // It's conceivable that EMPTY_PTR may not actually be a valid pointer
17*0a6a1f1dSLionel Sambuc   // (e.g. it's at the very bottom of the stack and the next page is
18*0a6a1f1dSLionel Sambuc   // invalid). This doesn't matter provided it's never loaded (there's no
19*0a6a1f1dSLionel Sambuc   // well-defined way to tell), but it becomes a problem if we do try to use it.
20*0a6a1f1dSLionel Sambuc // CHECK-NOT: load %struct.Empty* [[EMPTY_PTR]]
21*0a6a1f1dSLionel Sambuc 
22*0a6a1f1dSLionel Sambuc   int i = __builtin_va_arg(l, int);
23*0a6a1f1dSLionel Sambuc // CHECK: va_arg i8** {{%[a-zA-Z0-9._]+}}, i32
24*0a6a1f1dSLionel Sambuc 
25*0a6a1f1dSLionel Sambuc   __builtin_va_end(l);
26*0a6a1f1dSLionel Sambuc   return i;
27*0a6a1f1dSLionel Sambuc }
28