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:
Muhammad Usman Shahid 2022-09-12 07:47:18 -04:00 committed by Aaron Ballman
parent 8a15695be2
commit ea26ed1f9c
5 changed files with 23 additions and 8 deletions

View File

@ -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
-------------------------------------------------

View File

@ -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">;

View File

@ -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))

View File

@ -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;

View File

@ -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; }