summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2012-11-08 00:41:20 +0000
committerDavid Blaikie <dblaikie@gmail.com>2012-11-08 00:41:20 +0000
commite81b43bc306d361fcf4d411aeb14b43f8464bf4a (patch)
tree1ddf1bbd68f83893d4a0bf2467fd6b216ad1caf7
parente9385363069388d8e3536052a138f17332e00620 (diff)
downloadclang-e81b43bc306d361fcf4d411aeb14b43f8464bf4a.tar.gz
clang-e81b43bc306d361fcf4d411aeb14b43f8464bf4a.tar.bz2
clang-e81b43bc306d361fcf4d411aeb14b43f8464bf4a.tar.xz
PR14284: crash on ext-valid returning NULL from a void function
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@167565 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaChecking.cpp3
-rw-r--r--test/SemaCXX/null_in_arithmetic_ops.cpp2
2 files changed, 4 insertions, 1 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index a434425db8..692a210ef3 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -4799,7 +4799,8 @@ void CheckImplicitConversion(Sema &S, Expr *E, QualType T,
if ((E->isNullPointerConstant(S.Context, Expr::NPC_ValueDependentIsNotNull)
== Expr::NPCK_GNUNull) && !Target->isAnyPointerType()
- && !Target->isBlockPointerType() && !Target->isMemberPointerType()) {
+ && !Target->isBlockPointerType() && !Target->isMemberPointerType()
+ && Target->isScalarType()) {
SourceLocation Loc = E->getSourceRange().getBegin();
if (Loc.isMacroID())
Loc = S.SourceMgr.getImmediateExpansionRange(Loc).first;
diff --git a/test/SemaCXX/null_in_arithmetic_ops.cpp b/test/SemaCXX/null_in_arithmetic_ops.cpp
index a6c0dbfc65..a919213fb2 100644
--- a/test/SemaCXX/null_in_arithmetic_ops.cpp
+++ b/test/SemaCXX/null_in_arithmetic_ops.cpp
@@ -90,4 +90,6 @@ void f() {
b = e == NULL || NULL == e || e != NULL || NULL != e;
b = f == NULL || NULL == f || f != NULL || NULL != f;
b = "f" == NULL || NULL == "f" || "f" != NULL || NULL != "f";
+
+ return NULL; // expected-error{{void function 'f' should not return a value}}
}