diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2011-03-01 03:29:37 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2011-03-01 03:29:37 +0000 |
commit | 477a999788fbd328857d90cbcf4fe4d95c871713 (patch) | |
tree | c2ff72d18bd3da65ecfa6c73415063ac7884ae1e | |
parent | 96a7a59119e59da556dcb4f44186255c2336e330 (diff) | |
download | bcm5719-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.cpp | 4 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn_false_to_pointer.cpp | 7 |
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; |