]> granicus.if.org Git - clang/commitdiff
Do implicit conversion to bool for the condition in a do-while statement.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 11 Sep 2008 05:16:22 +0000 (05:16 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 11 Sep 2008 05:16:22 +0000 (05:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56096 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaStmt.cpp
test/SemaCXX/condition.cpp

index 706bcddff2e7d74689b11d02e85d120b31ecdd9e..d7a812cb2a8522e85ac4b078c902003a2dd7859c 100644 (file)
@@ -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());
 
index 59cc61ca9a4962b19ecbc0cb237405d27bf8cccc..b2f716f8840503dfa2960e3c83fc94253e60a2fe 100644 (file)
@@ -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}}