[cfe-commits] r146395 - in /cfe/trunk: include/clang/Basic/DiagnosticASTKinds.td lib/AST/ExprConstant.cpp test/SemaCXX/constant-expression-cxx11.cpp

Richard Smith richard-llvm at metafoo.co.uk
Mon Dec 12 11:10:03 PST 2011


Author: rsmith
Date: Mon Dec 12 13:10:03 2011
New Revision: 146395

URL: http://llvm.org/viewvc/llvm-project?rev=146395&view=rev
Log:
Clean up diagnostic wording for disallowed casts in C++11 constant expressions.

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

Modified: cfe/trunk/include/clang/Basic/DiagnosticASTKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticASTKinds.td?rev=146395&r1=146394&r2=146395&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticASTKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticASTKinds.td Mon Dec 12 13:10:03 2011
@@ -13,8 +13,8 @@
 //  "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 {

Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=146395&r1=146394&r2=146395&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Mon Dec 12 13:10:03 2011
@@ -2226,8 +2226,13 @@
     // 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();

Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp?rev=146395&r1=146394&r2=146395&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp (original)
+++ cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp Mon Dec 12 13:10:03 2011
@@ -301,25 +301,25 @@
   // 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[];





More information about the cfe-commits mailing list