diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2012-01-26 00:26:18 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2012-01-26 00:26:18 +0000 |
commit | 1da70394f68a5cc053661894f4567b59b670d68f (patch) | |
tree | 16bb3a31217bed5907f902e9d222ae808edafb7a /clang/lib | |
parent | 9ec3c4f5a7966b64310c53948bfb93252d87e77e (diff) | |
download | bcm5719-llvm-1da70394f68a5cc053661894f4567b59b670d68f.tar.gz bcm5719-llvm-1da70394f68a5cc053661894f4567b59b670d68f.zip |
Slight refactoring; catch yet another case where we were missing an lvalue-to-rvalue conversion.
llvm-svn: 149003
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 7 | ||||
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 11 | ||||
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 6 |
3 files changed, 11 insertions, 13 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 2f8bf774313..ae0c2c58c19 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -995,12 +995,7 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal, // C++ 5.3.4p6: "The expression in a direct-new-declarator shall have integral // or enumeration type with a non-negative value." if (ArraySize && !ArraySize->isTypeDependent()) { - ExprResult ConvertedSize = DefaultFunctionArrayLvalueConversion(ArraySize); - if (ConvertedSize.isInvalid()) - return ExprError(); - ArraySize = ConvertedSize.take(); - - ConvertedSize = ConvertToIntegralOrEnumerationType( + ExprResult ConvertedSize = ConvertToIntegralOrEnumerationType( StartLoc, ArraySize, PDiag(diag::err_array_size_not_integral), PDiag(diag::err_array_size_incomplete_type) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 36b6946a031..1aa59446697 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -4801,10 +4801,17 @@ Sema::ConvertToIntegralOrEnumerationType(SourceLocation Loc, Expr *From, if (From->isTypeDependent()) return Owned(From); + // Process placeholders immediately. + if (From->hasPlaceholderType()) { + ExprResult result = CheckPlaceholderExpr(From); + if (result.isInvalid()) return result; + From = result.take(); + } + // If the expression already has integral or enumeration type, we're golden. QualType T = From->getType(); if (T->isIntegralOrEnumerationType()) - return Owned(From); + return DefaultLvalueConversion(From); // FIXME: Check for missing '()' if T is a function type? @@ -4933,7 +4940,7 @@ Sema::ConvertToIntegralOrEnumerationType(SourceLocation Loc, Expr *From, Diag(Loc, NotIntDiag) << From->getType() << From->getSourceRange(); - return Owned(From); + return DefaultLvalueConversion(From); } /// AddOverloadCandidate - Adds the given function to the set of diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 0eb8d2863cf..fdcad08b5e3 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -495,12 +495,8 @@ Sema::ActOnStartOfSwitchStmt(SourceLocation SwitchLoc, Expr *Cond, if (!Cond) return StmtError(); - CondResult = DefaultFunctionArrayLvalueConversion(Cond); - if (CondResult.isInvalid()) - return StmtError(); - CondResult - = ConvertToIntegralOrEnumerationType(SwitchLoc, CondResult.take(), + = ConvertToIntegralOrEnumerationType(SwitchLoc, Cond, PDiag(diag::err_typecheck_statement_requires_integer), PDiag(diag::err_switch_incomplete_class_type) << Cond->getSourceRange(), |