[cfe-commits] r44366 - in /cfe/trunk: Sema/SemaDecl.cpp Sema/SemaExpr.cpp Sema/SemaStmt.cpp test/Sema/assign-null.c

Steve Naroff snaroff at apple.com
Tue Nov 27 09:58:44 PST 2007


Author: snaroff
Date: Tue Nov 27 11:58:44 2007
New Revision: 44366

URL: http://llvm.org/viewvc/llvm-project?rev=44366&view=rev
Log:

Move the null pointer constant check from Sema::CheckSingleInitializer/ActOnCallExpr/CheckMessageArgumentTypes/ActOnReturnStmt to Sema::CheckSingleAssignmentConstraints. This makes sure all null pointer assignments are considered compatible.

Thanks to Seo Sanghyeon for the bug, follow-through, and patch!


Added:
    cfe/trunk/test/Sema/assign-null.c
Modified:
    cfe/trunk/Sema/SemaDecl.cpp
    cfe/trunk/Sema/SemaExpr.cpp
    cfe/trunk/Sema/SemaStmt.cpp

Modified: cfe/trunk/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaDecl.cpp?rev=44366&r1=44365&r2=44366&view=diff

==============================================================================
--- cfe/trunk/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/Sema/SemaDecl.cpp Tue Nov 27 11:58:44 2007
@@ -391,13 +391,9 @@
          Init->getSourceRange());
     return true;
   case PointerFromInt:
-    // check for null pointer constant (C99 6.3.2.3p3)
-    if (!Init->isNullPointerConstant(Context)) {
-      Diag(loc, diag::ext_typecheck_assign_pointer_int,
-           DeclType.getAsString(), rhsType.getAsString(), 
-           Init->getSourceRange());
-      return true;
-    }
+    Diag(loc, diag::ext_typecheck_assign_pointer_int,
+         DeclType.getAsString(), rhsType.getAsString(), 
+         Init->getSourceRange());
     break;
   case IntFromPointer: 
     Diag(loc, diag::ext_typecheck_assign_pointer_int, 

Modified: cfe/trunk/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaExpr.cpp?rev=44366&r1=44365&r2=44366&view=diff

==============================================================================
--- cfe/trunk/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/Sema/SemaExpr.cpp Tue Nov 27 11:58:44 2007
@@ -613,12 +613,9 @@
       case Compatible:
         break;
       case PointerFromInt:
-        // check for null pointer constant (C99 6.3.2.3p3)
-        if (!argExpr->isNullPointerConstant(Context)) {
-          Diag(l, diag::ext_typecheck_passing_pointer_int, 
-               lhsType.getAsString(), rhsType.getAsString(),
-               Fn->getSourceRange(), argExpr->getSourceRange());
-        }
+        Diag(l, diag::ext_typecheck_passing_pointer_int, 
+             lhsType.getAsString(), rhsType.getAsString(),
+             Fn->getSourceRange(), argExpr->getSourceRange());
         break;
       case IntFromPointer:
         Diag(l, diag::ext_typecheck_passing_pointer_int, 
@@ -1125,6 +1122,12 @@
 
 Sema::AssignmentCheckResult
 Sema::CheckSingleAssignmentConstraints(QualType lhsType, Expr *&rExpr) {
+  // C99 6.5.16.1p1: the left operand is a pointer and the right is
+  // a null pointer constant.
+  if (lhsType->isPointerType() && rExpr->isNullPointerConstant(Context)) {
+    promoteExprToType(rExpr, lhsType);
+    return Compatible;
+  }
   // This check seems unnatural, however it is necessary to ensure the proper
   // conversion of functions/arrays. If the conversion were done for all
   // DeclExpr's (created by ActOnIdentifierExpr), it would mess up the unary
@@ -1412,12 +1415,9 @@
     hadError = true;
     break;
   case PointerFromInt:
-    // check for null pointer constant (C99 6.3.2.3p3)
-    if (compoundType.isNull() && !rex->isNullPointerConstant(Context)) {
-      Diag(loc, diag::ext_typecheck_assign_pointer_int,
-           lhsType.getAsString(), rhsType.getAsString(),
-           lex->getSourceRange(), rex->getSourceRange());
-    }
+    Diag(loc, diag::ext_typecheck_assign_pointer_int,
+         lhsType.getAsString(), rhsType.getAsString(),
+         lex->getSourceRange(), rex->getSourceRange());
     break;
   case IntFromPointer: 
     Diag(loc, diag::ext_typecheck_assign_pointer_int, 
@@ -2067,12 +2067,9 @@
     case Compatible:
       break;
     case PointerFromInt:
-      // check for null pointer constant (C99 6.3.2.3p3)
-      if (!argExpr->isNullPointerConstant(Context)) {
-        Diag(l, diag::ext_typecheck_sending_pointer_int, 
-             lhsType.getAsString(), rhsType.getAsString(),
-             argExpr->getSourceRange());
-      }
+      Diag(l, diag::ext_typecheck_sending_pointer_int, 
+           lhsType.getAsString(), rhsType.getAsString(),
+           argExpr->getSourceRange());
       break;
     case IntFromPointer:
       Diag(l, diag::ext_typecheck_sending_pointer_int, 

Modified: cfe/trunk/Sema/SemaStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaStmt.cpp?rev=44366&r1=44365&r2=44366&view=diff

==============================================================================
--- cfe/trunk/Sema/SemaStmt.cpp (original)
+++ cfe/trunk/Sema/SemaStmt.cpp Tue Nov 27 11:58:44 2007
@@ -617,12 +617,9 @@
          RetValExp->getSourceRange());
     break;
   case PointerFromInt:
-    // check for null pointer constant (C99 6.3.2.3p3)
-    if (!RetValExp->isNullPointerConstant(Context)) {
-      Diag(ReturnLoc, diag::ext_typecheck_return_pointer_int,
-           lhsType.getAsString(), rhsType.getAsString(),
-           RetValExp->getSourceRange());
-    }
+    Diag(ReturnLoc, diag::ext_typecheck_return_pointer_int,
+         lhsType.getAsString(), rhsType.getAsString(),
+         RetValExp->getSourceRange());
     break;
   case IntFromPointer:
     Diag(ReturnLoc, diag::ext_typecheck_return_pointer_int,

Added: cfe/trunk/test/Sema/assign-null.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/assign-null.c?rev=44366&view=auto

==============================================================================
--- cfe/trunk/test/Sema/assign-null.c (added)
+++ cfe/trunk/test/Sema/assign-null.c Tue Nov 27 11:58:44 2007
@@ -0,0 +1,10 @@
+// RUN: clang -fsyntax-only -verify %s
+
+#include <stddef.h>
+
+typedef void (*hookfunc)(void *arg);
+hookfunc hook;
+
+void clear_hook() {
+  hook = NULL;
+}





More information about the cfe-commits mailing list