John McCall a5efa7386a Track whether an AggValueSlot is potentially aliased, and do not
emit call results into potentially aliased slots.  This allows us
to properly mark indirect return slots as noalias, at the cost
of requiring an extra memcpy when assigning an aggregate call
result into a l-value.  It also brings us into compliance with
the x86-64 ABI.

llvm-svn: 138599
2011-08-25 23:04:34 +00:00

43 lines
968 B
C

// RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - -fblocks | FileCheck %s
void (^f)(void) = ^{};
// rdar://6768379
int f0(int (^a0)()) {
return a0(1, 2, 3);
}
// Verify that attributes on blocks are set correctly.
typedef struct s0 T;
struct s0 {
int a[64];
};
// CHECK: define internal void @__f2_block_invoke_0(%struct.s0* noalias sret {{%.*}}, i8* {{%.*}}, %struct.s0* byval align 4 {{.*}})
struct s0 f2(struct s0 a0) {
return ^(struct s0 a1){ return a1; }(a0);
}
// This should not crash: rdar://6808051
void *P = ^{
void *Q = __func__;
};
void (^test1)(void) = ^(void) {
__block int i;
^ { i = 1; }();
};
typedef double ftype(double);
// It's not clear that we *should* support this syntax, but until that decision
// is made, we should support it properly and not crash.
ftype ^test2 = ^ftype {
return 0;
};
// rdar://problem/8605032
void f3_helper(void (^)(void));
void f3() {
_Bool b = 0;
f3_helper(^{ if (b) {} });
}