summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2011-03-01 03:29:37 +0000
committerChandler Carruth <chandlerc@gmail.com>2011-03-01 03:29:37 +0000
commit477a999788fbd328857d90cbcf4fe4d95c871713 (patch)
treec2ff72d18bd3da65ecfa6c73415063ac7884ae1e
parent96a7a59119e59da556dcb4f44186255c2336e330 (diff)
downloadbcm5719-llvm-477a999788fbd328857d90cbcf4fe4d95c871713.tar.gz
bcm5719-llvm-477a999788fbd328857d90cbcf4fe4d95c871713.zip
Move the bool-conversions behind the DiagRuntimeBehavior logic. It's
possible for these to show up due to metaprogramming both in unevaluated contexts and compile-time dead branches. Those aren't the bugs we're looking for. llvm-svn: 126739
-rw-r--r--clang/lib/Sema/SemaOverload.cpp4
-rw-r--r--clang/test/SemaCXX/warn_false_to_pointer.cpp7
2 files changed, 9 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index f5316b564e2..14d545d3e48 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -1939,8 +1939,8 @@ bool Sema::CheckPointerConversion(Expr *From, QualType ToType,
if (CXXBoolLiteralExpr* LitBool
= dyn_cast<CXXBoolLiteralExpr>(From->IgnoreParens()))
if (!IsCStyleOrFunctionalCast && LitBool->getValue() == false)
- Diag(LitBool->getExprLoc(), diag::warn_init_pointer_from_false)
- << ToType;
+ DiagRuntimeBehavior(LitBool->getExprLoc(), From,
+ PDiag(diag::warn_init_pointer_from_false) << ToType);
if (const PointerType *FromPtrType = FromType->getAs<PointerType>())
if (const PointerType *ToPtrType = ToType->getAs<PointerType>()) {
diff --git a/clang/test/SemaCXX/warn_false_to_pointer.cpp b/clang/test/SemaCXX/warn_false_to_pointer.cpp
index fb6f9551a7a..26b54f6e685 100644
--- a/clang/test/SemaCXX/warn_false_to_pointer.cpp
+++ b/clang/test/SemaCXX/warn_false_to_pointer.cpp
@@ -8,3 +8,10 @@ void foo(int* i, int *j=(false)) // expected-warning{{ initialization of pointer
foo((int*)false);
}
+char f(struct Undefined*);
+double f(...);
+
+// Ensure that when using false in metaprogramming machinery its conversion
+// isn't flagged.
+template <int N> struct S {};
+S<sizeof(f(false))> s;
OpenPOWER on IntegriCloud