forked from OSchip/llvm-project
Add an explicit diagnostic for the case where an expression is not a constant
expression because it uses 'this'. Inspired by PR20219 comment#2. llvm-svn: 212433
This commit is contained in:
parent
45d099b995
commit
22a5d61b5d
|
@ -89,6 +89,9 @@ def note_constexpr_call_limit_exceeded : Note<
|
|||
"constexpr evaluation hit maximum call limit">;
|
||||
def note_constexpr_step_limit_exceeded : Note<
|
||||
"constexpr evaluation hit maximum step limit; possible infinite loop?">;
|
||||
def note_constexpr_this : Note<
|
||||
"%select{|implicit }0use of 'this' pointer is only allowed within the "
|
||||
"evaluation of a call to a 'constexpr' member function">;
|
||||
def note_constexpr_lifetime_ended : Note<
|
||||
"%select{read of|assignment to|increment of|decrement of}0 "
|
||||
"%select{temporary|variable}1 whose lifetime has ended">;
|
||||
|
@ -138,6 +141,7 @@ def note_constexpr_calls_suppressed : Note<
|
|||
"(skipping %0 call%s0 in backtrace; use -fconstexpr-backtrace-limit=0 to "
|
||||
"see all)">;
|
||||
def note_constexpr_call_here : Note<"in call to '%0'">;
|
||||
|
||||
def warn_integer_constant_overflow : Warning<
|
||||
"overflow in expression; result is %0 with type %1">,
|
||||
InGroup<DiagGroup<"integer-overflow">>;
|
||||
|
|
|
@ -4666,8 +4666,13 @@ public:
|
|||
// Can't look at 'this' when checking a potential constant expression.
|
||||
if (Info.checkingPotentialConstantExpression())
|
||||
return false;
|
||||
if (!Info.CurrentCall->This)
|
||||
return Error(E);
|
||||
if (!Info.CurrentCall->This) {
|
||||
if (Info.getLangOpts().CPlusPlus11)
|
||||
Info.Diag(E, diag::note_constexpr_this) << E->isImplicit();
|
||||
else
|
||||
Info.Diag(E);
|
||||
return false;
|
||||
}
|
||||
Result = *Info.CurrentCall->This;
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -823,6 +823,19 @@ static_assert(X() == 0, "");
|
|||
|
||||
}
|
||||
|
||||
struct This {
|
||||
constexpr int f() const { return 0; }
|
||||
static constexpr int g() { return 0; }
|
||||
void h() {
|
||||
constexpr int x = f(); // expected-error {{must be initialized by a constant}}
|
||||
// expected-note@-1 {{implicit use of 'this' pointer is only allowed within the evaluation of a call to a 'constexpr' member function}}
|
||||
constexpr int y = this->f(); // expected-error {{must be initialized by a constant}}
|
||||
// expected-note-re@-1 {{{{^}}use of 'this' pointer}}
|
||||
constexpr int z = g();
|
||||
static_assert(z == 0, "");
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace Temporaries {
|
||||
|
|
Loading…
Reference in New Issue