|  | // RUN: %clang_cc1 -triple mips-linux-gnu  -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS | 
|  | // RUN: %clang_cc1 -triple mips64-linux-gnu  -emit-llvm %s -o - | FileCheck %s -check-prefix=MIPS64 | 
|  | // RUN: %clang_cc1 -triple armebv7-linux-gnueabihf -emit-llvm %s -o - | FileCheck %s -check-prefix=ARM | 
|  |  | 
|  | #include <stdarg.h> | 
|  |  | 
|  | extern void abort(void) __attribute__((noreturn)); | 
|  |  | 
|  | struct tiny { | 
|  | char c; | 
|  | }; | 
|  |  | 
|  | union data { | 
|  | char c; | 
|  | }; | 
|  |  | 
|  | void fstr(int n, ...) { | 
|  | struct tiny x; | 
|  | va_list ap; | 
|  | va_start (ap,n); | 
|  | x = va_arg (ap, struct tiny); | 
|  | if (x.c !=  10) | 
|  | abort(); | 
|  | va_end (ap); | 
|  | // MIPS-NOT: %{{[0-9]+}} = getelementptr inbounds i8, ptr %argp.cur, i32 3 | 
|  | // MIPS64-NOT: %{{[0-9]+}} = getelementptr inbounds i8, ptr %argp.cur, i64 7 | 
|  | // ARM-NOT: %{{[0-9]+}} = getelementptr inbounds i8, ptr %argp.cur, i32 3 | 
|  | } | 
|  |  | 
|  | void funi(int n, ...) { | 
|  | union data x; | 
|  | va_list ap; | 
|  | va_start (ap,n); | 
|  | x = va_arg (ap, union data); | 
|  | if (x.c !=  10) | 
|  | abort(); | 
|  | va_end (ap); | 
|  | // MIPS-NOT: %{{[0-9]+}} = getelementptr inbounds i8, ptr %argp.cur, i32 3 | 
|  | // MIPS64-NOT: %{{[0-9]+}} = getelementptr inbounds i8, ptr %argp.cur, i64 7 | 
|  | // ARM-NOT: %{{[0-9]+}} = getelementptr inbounds i8, ptr %argp.cur, i32 3 | 
|  | } | 
|  |  | 
|  | void foo(void) { | 
|  | struct tiny x[3]; | 
|  | union data y; | 
|  | x[0].c = 10; | 
|  | fstr(1, x[0]); | 
|  | funi(1, y); | 
|  | } |