| 1 | // Test returning a single element aggregate value containing a double. |
| 2 | // RUN: %clang_cc1 -triple i686-linux %s -emit-llvm -o - | FileCheck %s --check-prefix=X86_32 |
| 3 | // RUN: %clang_cc1 %s -emit-llvm -o - |
| 4 | |
| 5 | struct X { |
| 6 | double D; |
| 7 | }; |
| 8 | |
| 9 | struct Y { |
| 10 | struct X x; |
| 11 | }; |
| 12 | |
| 13 | struct Y bar(); |
| 14 | |
| 15 | void foo(struct Y *P) { |
| 16 | *P = bar(); |
| 17 | } |
| 18 | |
| 19 | struct Y bar() { |
| 20 | struct Y a; |
| 21 | a.x.D = 0; |
| 22 | return a; |
| 23 | } |
| 24 | |
| 25 | |
| 26 | // X86_32: define void @foo(%struct.Y* %P) |
| 27 | // X86_32: call void @bar(%struct.Y* sret %{{[^),]*}}) |
| 28 | |
| 29 | // X86_32: define void @bar(%struct.Y* noalias sret %{{[^,)]*}}) |
| 30 | // X86_32: ret void |
| 31 | |