forked from OSchip/llvm-project
Rewording note note_constexpr_invalid_cast
The diagnostics here are correct, but the note is really silly. It talks about reinterpret_cast in C code. So rewording it for c mode by using another %select{}. ``` int array[(long)(char *)0]; ``` previous note: ``` cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression ``` reworded note: ``` this conversion is not allowed in a constant expression ``` Differential Revision: https://reviews.llvm.org/D133194
This commit is contained in:
parent
8a15695be2
commit
ea26ed1f9c
|
@ -136,6 +136,8 @@ Improvements to Clang's diagnostics
|
|||
- no_sanitize("...") on a global variable for known but not relevant sanitizers
|
||||
is now just a warning. It now says that this will be ignored instead of
|
||||
incorrectly saying no_sanitize only applies to functions and methods.
|
||||
- No longer mention ``reinterpet_cast`` in the invalid constant expression
|
||||
diagnostic note when in C mode.
|
||||
|
||||
Non-comprehensive list of changes in this release
|
||||
-------------------------------------------------
|
||||
|
|
|
@ -11,8 +11,9 @@ let Component = "AST" in {
|
|||
// Constant expression diagnostics. These (and their users) belong in Sema.
|
||||
def note_expr_divide_by_zero : Note<"division by zero">;
|
||||
def note_constexpr_invalid_cast : Note<
|
||||
"%select{reinterpret_cast|dynamic_cast|cast that performs the conversions of"
|
||||
" a reinterpret_cast|cast from %1}0 is not allowed in a constant expression"
|
||||
"%select{reinterpret_cast|dynamic_cast|%select{this conversion|cast that"
|
||||
" performs the conversions of a reinterpret_cast}1|cast from %1}0"
|
||||
" is not allowed in a constant expression"
|
||||
"%select{| in C++ standards before C++20||}0">;
|
||||
def note_constexpr_invalid_downcast : Note<
|
||||
"cannot cast object of dynamic type %0 to type %1">;
|
||||
|
|
|
@ -8178,7 +8178,8 @@ public:
|
|||
return LValueExprEvaluatorBaseTy::VisitCastExpr(E);
|
||||
|
||||
case CK_LValueBitCast:
|
||||
this->CCEDiag(E, diag::note_constexpr_invalid_cast) << 2;
|
||||
this->CCEDiag(E, diag::note_constexpr_invalid_cast)
|
||||
<< 2 << Info.Ctx.getLangOpts().CPlusPlus;
|
||||
if (!Visit(E->getSubExpr()))
|
||||
return false;
|
||||
Result.Designator.setInvalid();
|
||||
|
@ -8889,9 +8890,10 @@ bool PointerExprEvaluator::VisitCastExpr(const CastExpr *E) {
|
|||
Result.Designator.setInvalid();
|
||||
if (SubExpr->getType()->isVoidPointerType())
|
||||
CCEDiag(E, diag::note_constexpr_invalid_cast)
|
||||
<< 3 << SubExpr->getType();
|
||||
<< 3 << SubExpr->getType();
|
||||
else
|
||||
CCEDiag(E, diag::note_constexpr_invalid_cast) << 2;
|
||||
CCEDiag(E, diag::note_constexpr_invalid_cast)
|
||||
<< 2 << Info.Ctx.getLangOpts().CPlusPlus;
|
||||
}
|
||||
}
|
||||
if (E->getCastKind() == CK_AddressSpaceConversion && Result.IsNullPtr)
|
||||
|
@ -8928,7 +8930,8 @@ bool PointerExprEvaluator::VisitCastExpr(const CastExpr *E) {
|
|||
return ZeroInitialization(E);
|
||||
|
||||
case CK_IntegralToPointer: {
|
||||
CCEDiag(E, diag::note_constexpr_invalid_cast) << 2;
|
||||
CCEDiag(E, diag::note_constexpr_invalid_cast)
|
||||
<< 2 << Info.Ctx.getLangOpts().CPlusPlus;
|
||||
|
||||
APValue Value;
|
||||
if (!EvaluateIntegerOrLValue(SubExpr, Value, Info))
|
||||
|
@ -13587,7 +13590,8 @@ bool IntExprEvaluator::VisitCastExpr(const CastExpr *E) {
|
|||
}
|
||||
|
||||
case CK_PointerToIntegral: {
|
||||
CCEDiag(E, diag::note_constexpr_invalid_cast) << 2;
|
||||
CCEDiag(E, diag::note_constexpr_invalid_cast)
|
||||
<< 2 << Info.Ctx.getLangOpts().CPlusPlus;
|
||||
|
||||
LValue LV;
|
||||
if (!EvaluatePointer(SubExpr, LV, Info))
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -triple x86_64-unknown-unknown %s -verify
|
||||
// RUN: %clang_cc1 -fsyntax-only -triple x86_64-unknown-unknown %s -verify -Wvla
|
||||
|
||||
int array[(long)(char *)0]; // expected-warning {{variable length array used}} \
|
||||
// expected-warning {{variable length array folded to constant array as an extension}} \
|
||||
// expected-note {{this conversion is not allowed in a constant expression}}
|
||||
|
||||
typedef struct { unsigned long bits[(((1) + (64) - 1) / (64))]; } cpumask_t;
|
||||
cpumask_t x;
|
||||
|
|
|
@ -11,6 +11,10 @@ static_assert(false, "test"); // expected-error {{test}}
|
|||
|
||||
}
|
||||
|
||||
int array[(long)(char *)0]; // expected-warning {{variable length arrays are a C99 feature}} \
|
||||
// expected-warning {{variable length array folded to constant array as an extension}} \
|
||||
// expected-note {{cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
|
||||
|
||||
typedef decltype(sizeof(char)) size_t;
|
||||
|
||||
template<typename T> constexpr T id(const T &t) { return t; }
|
||||
|
|
Loading…
Reference in New Issue