From: Argyrios Kyrtzidis Date: Thu, 11 Sep 2008 05:16:22 +0000 (+0000) Subject: Do implicit conversion to bool for the condition in a do-while statement. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6314ff264c345b5babb9faf50dad0bc68d7bd74e;p=clang Do implicit conversion to bool for the condition in a do-while statement. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56096 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 706bcddff2..d7a812cb2a 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -530,7 +530,10 @@ Sema::ActOnDoStmt(SourceLocation DoLoc, StmtTy *Body, 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()); diff --git a/test/SemaCXX/condition.cpp b/test/SemaCXX/condition.cpp index 59cc61ca9a..b2f716f884 100644 --- a/test/SemaCXX/condition.cpp +++ b/test/SemaCXX/condition.cpp @@ -12,6 +12,8 @@ void test() { struct S {} s; if (s) ++x; // expected-error: {{expression must have bool type (or be convertible to bool) ('struct S' invalid)}} while (struct S x=s) ; // expected-error: {{expression must have bool type (or be convertible to bool) ('struct S' invalid)}} + do ; while (s); // expected-error: {{expression must have bool type (or be convertible to bool) ('struct S' invalid)}} + for (;s;) ; // expected-error: {{expression must have bool type (or be convertible to bool) ('struct S' invalid)}} switch (s) {} // expected-error: {{statement requires expression of integer type ('struct S' invalid)}} while (struct S {} x=0) ; // expected-error: {{types may not be defined in conditions}} expected-error: {{incompatible type}} expected-error: {{expression must have bool type}}