forked from OSchip/llvm-project
First pass at implementing the intent of ANSI C DR106.
llvm-svn: 120904
This commit is contained in:
parent
a03eddad58
commit
ca61b6567b
|
@ -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
|
||||
|
|
|
@ -3549,8 +3549,9 @@ void Sema::IgnoredValueConversions(Expr *&E) {
|
|||
}
|
||||
|
||||
DefaultFunctionArrayLvalueConversion(E);
|
||||
RequireCompleteType(E->getExprLoc(), E->getType(),
|
||||
diag::err_incomplete_type);
|
||||
if (!E->getType()->isVoidType())
|
||||
RequireCompleteType(E->getExprLoc(), E->getType(),
|
||||
diag::err_incomplete_type);
|
||||
}
|
||||
|
||||
ExprResult Sema::ActOnFinishFullExpr(Expr *FullExpr) {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue