[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