]> granicus.if.org Git - clang/commitdiff
Clean up diagnostic wording for disallowed casts in C++11 constant expressions.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 12 Dec 2011 19:10:03 +0000 (19:10 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Mon, 12 Dec 2011 19:10:03 +0000 (19:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146395 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticASTKinds.td
lib/AST/ExprConstant.cpp
test/SemaCXX/constant-expression-cxx11.cpp

index e16f768b2a9bb71f989a4e3a5a1114f00100b0f0..9f0da2d6eb7212d61ea779cc27f98361b3d9fe53 100644 (file)
@@ -13,8 +13,8 @@ let Component = "AST" in {
 //  "C does not permit evaluated commas in an integer constant expression">;
 def note_expr_divide_by_zero : Note<"division by zero">;
 def note_constexpr_invalid_cast : Note<
-  "%select{reinterpret_cast|dynamic_cast|reinterpreting cast}0 not allowed "
-  "in a constant expression">;
+  "%select{reinterpret_cast|dynamic_cast|cast interpreted as a "
+  "reinterpret_cast|cast from %1}0 is not allowed in a constant expression">;
 
 // inline asm related.
 let CategoryName = "Inline Assembly Issue" in {
index 62d70dd978284f136e1bc7fa38880451f11a4863..3a897ab34842dc9a2efb9fadee3b1eff3b34e492 100644 (file)
@@ -2226,8 +2226,13 @@ bool PointerExprEvaluator::VisitCastExpr(const CastExpr* E) {
     // Bitcasts to cv void* are static_casts, not reinterpret_casts, so are
     // permitted in constant expressions in C++11. Bitcasts from cv void* are
     // also static_casts, but we disallow them as a resolution to DR1312.
-    if (!E->getType()->isVoidPointerType())
-      CCEDiag(E, diag::note_constexpr_invalid_cast) << 2;
+    if (!E->getType()->isVoidPointerType()) {
+      if (SubExpr->getType()->isVoidPointerType())
+        CCEDiag(E, diag::note_constexpr_invalid_cast)
+          << 3 << SubExpr->getType();
+      else
+        CCEDiag(E, diag::note_constexpr_invalid_cast) << 2;
+    }
     if (!Visit(SubExpr))
       return false;
     Result.Designator.setInvalid();
index 55762b4ea4ce17092029e22063db5168bb481d68..3ba76d42997cd1e839fac21fff5ccd89b499fe17 100644 (file)
@@ -301,25 +301,25 @@ struct Str {
   // FIXME: In C++ mode, we should say 'integral' not 'integer'
   int a : dynamic_cast<S*>(sptr) == dynamic_cast<S*>(sptr); // \
     expected-warning {{not integer constant expression}} \
-    expected-note {{dynamic_cast not allowed in a constant expression}}
+    expected-note {{dynamic_cast is not allowed in a constant expression}}
   int b : reinterpret_cast<S*>(sptr) == reinterpret_cast<S*>(sptr); // \
     expected-warning {{not integer constant expression}} \
-    expected-note {{reinterpret_cast not allowed in a constant expression}}
+    expected-note {{reinterpret_cast is not allowed in a constant expression}}
   int c : (S*)(long)(sptr) == (S*)(long)(sptr); // \
     expected-warning {{not integer constant expression}} \
-    expected-note {{reinterpreting cast not allowed in a constant expression}}
+    expected-note {{cast interpreted as a reinterpret_cast is not allowed in a constant expression}}
   int d : (S*)(42) == (S*)(42); // \
     expected-warning {{not integer constant expression}} \
-    expected-note {{reinterpreting cast not allowed in a constant expression}}
+    expected-note {{cast interpreted as a reinterpret_cast is not allowed in a constant expression}}
   int e : (Str*)(sptr) == (Str*)(sptr); // \
     expected-warning {{not integer constant expression}} \
-    expected-note {{reinterpreting cast not allowed in a constant expression}}
+    expected-note {{cast interpreted as a reinterpret_cast is not allowed in a constant expression}}
   int f : &(Str&)(*sptr) == &(Str&)(*sptr); // \
     expected-warning {{not integer constant expression}} \
-    expected-note {{reinterpreting cast not allowed in a constant expression}}
+    expected-note {{cast interpreted as a reinterpret_cast is not allowed in a constant expression}}
   int g : (S*)(void*)(sptr) == sptr; // \
     expected-warning {{not integer constant expression}} \
-    expected-note {{reinterpreting cast not allowed in a constant expression}}
+    expected-note {{cast from 'void *' is not allowed in a constant expression}}
 };
 
 extern char externalvar[];