forked from OSchip/llvm-project
Clean up diagnostic wording for disallowed casts in C++11 constant expressions.
llvm-svn: 146395
This commit is contained in:
parent
fc5dd29ef7
commit
ff07af12df
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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[];
|
||||
|
|
Loading…
Reference in New Issue