forked from OSchip/llvm-project
Pedantic diagnostic correction: in C++, we have integral constant expressions,
not integer constant expressions. In passing, fix the 'folding is an extension' diagnostic to not claim we're accepting the code, since that's not true in -pedantic-errors mode, and add this diagnostic to -Wgnu. llvm-svn: 148209
This commit is contained in:
parent
b19ac0d6ca
commit
2ec4061e39
|
@ -16,10 +16,10 @@ let CategoryName = "Semantic Issue" in {
|
|||
|
||||
// Constant expressions
|
||||
def err_expr_not_ice : Error<
|
||||
"expression is not an integer constant expression">;
|
||||
"expression is not an %select{integer|integral}0 constant expression">;
|
||||
def ext_expr_not_ice : Extension<
|
||||
"expression is not integer constant expression "
|
||||
"(but is allowed as an extension)">;
|
||||
"expression is not an %select{integer|integral}0 constant expression; "
|
||||
"folding it to a constant is a GNU extension">, InGroup<GNU>;
|
||||
|
||||
// Semantic analysis of constant literals.
|
||||
def ext_predef_outside_function : Warning<
|
||||
|
|
|
@ -9268,9 +9268,11 @@ bool Sema::VerifyIntegerConstantExpression(const Expr *E, llvm::APSInt *Result,
|
|||
}
|
||||
|
||||
if (!Folded || !AllowFold) {
|
||||
Diag(E->getSourceRange().getBegin(),
|
||||
DiagID ? DiagID : unsigned(diag::err_expr_not_ice))
|
||||
<< E->getSourceRange();
|
||||
if (DiagID)
|
||||
Diag(E->getSourceRange().getBegin(), DiagID) << E->getSourceRange();
|
||||
else
|
||||
Diag(E->getSourceRange().getBegin(), diag::err_expr_not_ice)
|
||||
<< E->getSourceRange() << LangOpts.CPlusPlus;
|
||||
|
||||
// We only show the notes if they're not the usual "invalid subexpression"
|
||||
// or if they are actually in a subexpression.
|
||||
|
@ -9285,12 +9287,9 @@ bool Sema::VerifyIntegerConstantExpression(const Expr *E, llvm::APSInt *Result,
|
|||
}
|
||||
|
||||
Diag(E->getSourceRange().getBegin(), diag::ext_expr_not_ice)
|
||||
<< E->getSourceRange();
|
||||
|
||||
if (Diags.getDiagnosticLevel(diag::ext_expr_not_ice, E->getExprLoc())
|
||||
!= DiagnosticsEngine::Ignored)
|
||||
for (unsigned I = 0, N = Notes.size(); I != N; ++I)
|
||||
Diag(Notes[I].first, Notes[I].second);
|
||||
<< E->getSourceRange() << LangOpts.CPlusPlus;
|
||||
for (unsigned I = 0, N = Notes.size(); I != N; ++I)
|
||||
Diag(Notes[I].first, Notes[I].second);
|
||||
|
||||
if (Result)
|
||||
*Result = EvalResult.Val.getInt();
|
||||
|
|
|
@ -136,7 +136,7 @@ namespace UndefinedBehavior {
|
|||
}
|
||||
constexpr int n = (f(p), 0); // expected-error {{constant expression}} expected-note {{in call to 'f(&s.m + 1)'}}
|
||||
struct T {
|
||||
int n : f(p); // expected-error {{not an integer constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
|
||||
int n : f(p); // expected-error {{not an integral constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}}
|
||||
};
|
||||
|
||||
namespace Ptr {
|
||||
|
|
|
@ -17,7 +17,7 @@ This test serves two purposes:
|
|||
|
||||
The list of warnings below should NEVER grow. It should gradually shrink to 0.
|
||||
|
||||
CHECK: Warnings without flags (267):
|
||||
CHECK: Warnings without flags (266):
|
||||
CHECK-NEXT: ext_anon_param_requires_type_specifier
|
||||
CHECK-NEXT: ext_anonymous_struct_union_qualified
|
||||
CHECK-NEXT: ext_array_init_copy
|
||||
|
@ -35,7 +35,6 @@ CHECK-NEXT: ext_enumerator_list_comma
|
|||
CHECK-NEXT: ext_expected_semi_decl_list
|
||||
CHECK-NEXT: ext_explicit_instantiation_without_qualified_id
|
||||
CHECK-NEXT: ext_explicit_specialization_storage_class
|
||||
CHECK-NEXT: ext_expr_not_ice
|
||||
CHECK-NEXT: ext_extra_ivar_semi
|
||||
CHECK-NEXT: ext_extra_struct_semi
|
||||
CHECK-NEXT: ext_forward_ref_enum
|
||||
|
|
|
@ -13,5 +13,5 @@ enum
|
|||
|
||||
enum
|
||||
{
|
||||
SOME_VALUE= FLOAT_TO_SHORT_FIXED(0.1) // expected-warning{{expression is not integer constant expression}}
|
||||
SOME_VALUE= FLOAT_TO_SHORT_FIXED(0.1) // expected-warning{{expression is not an integer constant expression}}
|
||||
};
|
||||
|
|
|
@ -93,7 +93,7 @@ namespace CaseStatements {
|
|||
void f(int n) {
|
||||
switch (n) {
|
||||
// FIXME: Produce the 'add ()' fixit for this.
|
||||
case MemberZero().zero: // desired-error {{did you mean to call it with no arguments?}} expected-error {{not an integer constant expression}} expected-note {{non-literal type '<bound member function type>'}}
|
||||
case MemberZero().zero: // desired-error {{did you mean to call it with no arguments?}} expected-error {{not an integral constant expression}} expected-note {{non-literal type '<bound member function type>'}}
|
||||
case id(1):
|
||||
return;
|
||||
}
|
||||
|
@ -299,27 +299,26 @@ constexpr S* sptr = &s;
|
|||
constexpr bool dyncast = sptr == dynamic_cast<S*>(sptr); // expected-error {{constant expression}} expected-note {{dynamic_cast}}
|
||||
|
||||
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-warning {{not an integral 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-warning {{not an integral 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-warning {{not an integral constant expression}} \
|
||||
expected-note {{cast which performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
|
||||
int d : (S*)(42) == (S*)(42); // \
|
||||
expected-warning {{not integer constant expression}} \
|
||||
expected-warning {{not an integral constant expression}} \
|
||||
expected-note {{cast which performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
|
||||
int e : (Str*)(sptr) == (Str*)(sptr); // \
|
||||
expected-warning {{not integer constant expression}} \
|
||||
expected-warning {{not an integral constant expression}} \
|
||||
expected-note {{cast which performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
|
||||
int f : &(Str&)(*sptr) == &(Str&)(*sptr); // \
|
||||
expected-warning {{not integer constant expression}} \
|
||||
expected-warning {{not an integral constant expression}} \
|
||||
expected-note {{cast which performs the conversions of a reinterpret_cast is not allowed in a constant expression}}
|
||||
int g : (S*)(void*)(sptr) == sptr; // \
|
||||
expected-warning {{not integer constant expression}} \
|
||||
expected-warning {{not an integral constant expression}} \
|
||||
expected-note {{cast from 'void *' is not allowed in a constant expression}}
|
||||
};
|
||||
|
||||
|
|
|
@ -88,10 +88,10 @@ enum {
|
|||
|
||||
void diags(int n) {
|
||||
switch (n) {
|
||||
case (1/0, 1): // expected-error {{not an integer constant expression}} expected-note {{division by zero}}
|
||||
case (int)(1/0, 2.0): // expected-error {{not an integer constant expression}} expected-note {{division by zero}}
|
||||
case __imag(1/0): // expected-error {{not an integer constant expression}} expected-note {{division by zero}}
|
||||
case (int)__imag((double)(1/0)): // expected-error {{not an integer constant expression}} expected-note {{division by zero}}
|
||||
case (1/0, 1): // expected-error {{not an integral constant expression}} expected-note {{division by zero}}
|
||||
case (int)(1/0, 2.0): // expected-error {{not an integral constant expression}} expected-note {{division by zero}}
|
||||
case __imag(1/0): // expected-error {{not an integral constant expression}} expected-note {{division by zero}}
|
||||
case (int)__imag((double)(1/0)): // expected-error {{not an integral constant expression}} expected-note {{division by zero}}
|
||||
;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,5 +14,5 @@ struct X {
|
|||
|
||||
struct Y {
|
||||
enum E : int(2);
|
||||
enum E : Z(); // expected-error{{not an integer constant}}
|
||||
enum E : Z(); // expected-error{{not an integral constant}}
|
||||
};
|
||||
|
|
|
@ -88,7 +88,7 @@ typedef enum { }; // expected-warning{{typedef requires a name}}
|
|||
|
||||
// PR7921
|
||||
enum PR7921E {
|
||||
PR7921V = (PR7921E)(123) // expected-error {{expression is not an integer constant expression}}
|
||||
PR7921V = (PR7921E)(123) // expected-error {{expression is not an integral constant expression}}
|
||||
};
|
||||
|
||||
void PR8089() {
|
||||
|
|
|
@ -18,7 +18,7 @@ void f() {
|
|||
int a() {
|
||||
const int t=t; // expected-note {{declared here}}
|
||||
switch(1) { // expected-warning {{no case matching constant switch condition '1'}}
|
||||
case t:; // expected-error {{not an integer constant expression}} expected-note {{initializer of 't' is not a constant expression}}
|
||||
case t:; // expected-error {{not an integral constant expression}} expected-note {{initializer of 't' is not a constant expression}}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ void test_BitfieldMinus() {
|
|||
|
||||
template<int I, int J>
|
||||
struct BitfieldDivide {
|
||||
int bitfield : I / J; // expected-error{{expression is not an integer constant expression}} \
|
||||
int bitfield : I / J; // expected-error{{expression is not an integral constant expression}} \
|
||||
// expected-note{{division by zero}}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue