]> granicus.if.org Git - clang/commitdiff
Fix the type of conditionals involving void* to be self-consistent and
authorEli Friedman <eli.friedman@gmail.com>
Sun, 10 Feb 2008 22:59:36 +0000 (22:59 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sun, 10 Feb 2008 22:59:36 +0000 (22:59 +0000)
spec-compliant.

I'll put together some testcases in a bit.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46937 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaExpr.cpp

index 2b63c10d98e0eba118e834b8205f9467520fa258..8764a5e829d7e183f9c5b3be7fdcf2c82196b5f5 100644 (file)
@@ -821,11 +821,22 @@ inline QualType Sema::CheckConditionalOperands( // C99 6.5.15
 
       // ignore qualifiers on void (C99 6.5.15p3, clause 6)
       if (lhptee->isVoidType() &&
-          (rhptee->isObjectType() || rhptee->isIncompleteType()))
-        return lexT;
+          (rhptee->isObjectType() || rhptee->isIncompleteType())) {
+        // figure out necessary qualifiers (C99 6.5.15p6)
+        QualType destPointee = lhptee.getQualifiedType(rhptee.getQualifiers());
+        QualType destType = Context.getPointerType(destPointee);
+        ImpCastExprToType(lex, destType); // add qualifiers if necessary
+        ImpCastExprToType(rex, destType); // promote to void*
+        return destType;
+      }
       if (rhptee->isVoidType() &&
-          (lhptee->isObjectType() || lhptee->isIncompleteType()))
-        return rexT;
+          (lhptee->isObjectType() || lhptee->isIncompleteType())) {
+        QualType destPointee = rhptee.getQualifiedType(lhptee.getQualifiers());
+        QualType destType = Context.getPointerType(destPointee);
+        ImpCastExprToType(lex, destType); // add qualifiers if necessary
+        ImpCastExprToType(rex, destType); // promote to void*
+        return destType;
+      }
 
       if (!Context.typesAreCompatible(lhptee.getUnqualifiedType(), 
                                       rhptee.getUnqualifiedType())) {
@@ -846,6 +857,7 @@ inline QualType Sema::CheckConditionalOperands( // C99 6.5.15
       // a pointer to an appropriately qualified version of the *composite*
       // type.
       // FIXME: Need to return the composite type.
+      // FIXME: Need to add qualifiers
       return lexT;
     }
   }