diff options
author | John McCall <rjmccall@apple.com> | 2010-12-04 12:29:11 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-12-04 12:29:11 +0000 |
commit | 85515d64c15838eadb3ffe82b635f8217b04be8a (patch) | |
tree | b4783154e6eb4c35452513206ca4ca3a1bfb821c /lib | |
parent | 9ec9445402f4365fb0ac6e28e8be78cda3e9d8af (diff) |
First pass at implementing the intent of ANSI C DR106.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120904 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 7 | ||||
-rw-r--r-- | lib/Sema/SemaExprCXX.cpp | 5 |
2 files changed, 10 insertions, 2 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index cf17566d41..3d6d59a406 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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 diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index fc396b992f..eec2fc88db 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -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) { |