CheckCXXBooleanCondition follows the convention of other check functions (CheckInitializerTypes, CheckSingleInitializer, CheckCastTypes, etc) which is that it doesn't just receive the expression to check, but a reference to it so that it can replace it with another expression as needed. It replaces the given Expr node with an implicit cast expr node, and returns false if it was successful. If it can't convert to bool and a diagnostic was emitted, it returns true (works similar to the other check functions).
-Argiris Neil Booth wrote: > Argiris Kirtzidis wrote:- > > >> Author: akirtzidis >> Date: Thu Sep 11 00:16:22 2008 >> New Revision: 56096 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=56096&view=rev >> Log: >> Do implicit conversion to bool for the condition in a do-while statement. >> >> Modified: >> cfe/trunk/lib/Sema/SemaStmt.cpp >> cfe/trunk/test/SemaCXX/condition.cpp >> >> Modified: cfe/trunk/lib/Sema/SemaStmt.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=56096&r1=56095&r2=56096&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaStmt.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaStmt.cpp Thu Sep 11 00:16:22 2008 >> @@ -530,7 +530,10 @@ >> DefaultFunctionArrayConversion(condExpr); >> QualType condType = condExpr->getType(); >> >> - if (!condType->isScalarType()) // C99 6.8.5p2 >> + if (getLangOptions().CPlusPlus) { >> + if (CheckCXXBooleanCondition(condExpr)) // C++ 6.4p4 >> + return true; >> + } else if (!condType->isScalarType()) // C99 6.8.5p2 >> return Diag(DoLoc, diag::err_typecheck_statement_requires_scalar, >> condType.getAsString(), condExpr->getSourceRange()); >> > > Isn't this just checking the conversion is OK, but not doing it? > > Neil. > > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
