diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-12-12 19:10:03 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-12-12 19:10:03 +0000 |
commit | 4cd9b8f7fb2cebf614e6e2bc766fad27ffd2e9de (patch) | |
tree | a7a36ba370ecade52568456e684b0d98067bc928 | |
parent | d83d2e73fdbe425acc4cac7b8130c464cb98333d (diff) |
Clean up diagnostic wording for disallowed casts in C++11 constant expressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146395 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticASTKinds.td | 4 | ||||
-rw-r--r-- | lib/AST/ExprConstant.cpp | 9 | ||||
-rw-r--r-- | test/SemaCXX/constant-expression-cxx11.cpp | 14 |
3 files changed, 16 insertions, 11 deletions
diff --git a/include/clang/Basic/DiagnosticASTKinds.td b/include/clang/Basic/DiagnosticASTKinds.td index e16f768b2a..9f0da2d6eb 100644 --- a/include/clang/Basic/DiagnosticASTKinds.td +++ b/include/clang/Basic/DiagnosticASTKinds.td @@ -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 { diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 62d70dd978..3a897ab348 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -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(); diff --git a/test/SemaCXX/constant-expression-cxx11.cpp b/test/SemaCXX/constant-expression-cxx11.cpp index 55762b4ea4..3ba76d4299 100644 --- a/test/SemaCXX/constant-expression-cxx11.cpp +++ b/test/SemaCXX/constant-expression-cxx11.cpp @@ -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[]; |