First pass at implementing the intent of ANSI C DR106.

llvm-svn: 120904
This commit is contained in:
John McCall 2010-12-04 12:29:11 +00:00
parent a03eddad58
commit ca61b6567b
3 changed files with 26 additions and 4 deletions

View File

@ -269,6 +269,13 @@ void Sema::DefaultFunctionArrayLvalueConversion(Expr *&E) {
T->isRecordType()))
return;
// The C standard is actually really unclear on this point, and
// DR106 tells us what the result should be but not why. It's
// generally best to say that void just doesn't undergo
// lvalue-to-rvalue at all.
if (T->isVoidType())
return;
// C++ [conv.lval]p1:
// [...] If T is a non-class type, the type of the prvalue is the
// cv-unqualified version of T. Otherwise, the type of the

View File

@ -3549,6 +3549,7 @@ void Sema::IgnoredValueConversions(Expr *&E) {
}
DefaultFunctionArrayLvalueConversion(E);
if (!E->getType()->isVoidType())
RequireCompleteType(E->getExprLoc(), E->getType(),
diag::err_incomplete_type);
}

View File

@ -147,8 +147,22 @@ double f13(double X) {
}
// Check operations on incomplete types.
struct s14;
void f14(struct s13 *a) {
void f14(struct s14 *a) {
(void) &*a;
}
// CHECK: define void @f15
void f15(void *v, const void *cv, volatile void *vv) {
extern void f15_helper(void);
f15_helper();
// CHECK: call void @f15_helper()
// FIXME: no loads from i8* should occur here at all!
*v; *v, *v; v ? *v : *v;
*cv; *cv, *cv; v ? *cv : *cv;
*vv; *vv, *vv; vv ? *vv : *vv;
// CHECK: volatile load i8*
// CHECK: volatile load i8*
// CHECK: volatile load i8*
// CHECK-NOT: load i8* %
// CHECK: ret void
}