PR23942: a pure-specifier's integer literal must be spelled '0'
llvm-svn: 241019
This commit is contained in:
parent
5d7dffb6f4
commit
40cdd7a8ea
|
@ -8783,6 +8783,19 @@ namespace {
|
|||
}
|
||||
}
|
||||
|
||||
/// Determine whether the given expression was formed from the token '0'. This
|
||||
/// test is necessary to determine whether an initializer is really a
|
||||
/// pure-specifier.
|
||||
static bool isZeroToken(Sema &S, Expr *E) {
|
||||
auto *IL = dyn_cast<IntegerLiteral>(E);
|
||||
if (!IL || !!IL->getValue() ||
|
||||
!IL->getType()->isSpecificBuiltinType(BuiltinType::Int))
|
||||
return false;
|
||||
|
||||
SmallString<8> Buffer;
|
||||
return S.PP.getSpelling(E->getLocStart(), Buffer) == "0";
|
||||
}
|
||||
|
||||
/// AddInitializerToDecl - Adds the initializer Init to the
|
||||
/// declaration dcl. If DirectInit is true, this is C++ direct
|
||||
/// initialization rather than copy initialization.
|
||||
|
@ -8799,9 +8812,11 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init,
|
|||
// With declarators parsed the way they are, the parser cannot
|
||||
// distinguish between a normal initializer and a pure-specifier.
|
||||
// Thus this grotesque test.
|
||||
IntegerLiteral *IL;
|
||||
if ((IL = dyn_cast<IntegerLiteral>(Init)) && IL->getValue() == 0 &&
|
||||
Context.getCanonicalType(IL->getType()) == Context.IntTy)
|
||||
//
|
||||
// FIXME: The parser should instead treat anything that looks like a
|
||||
// pure-specifier as a pure-specifier, and Sema should convert it to an
|
||||
// initializer when necessary, rather than doing things this way around.
|
||||
if (!DirectInit && isZeroToken(*this, Init))
|
||||
CheckPureMethod(Method, Init->getSourceRange());
|
||||
else {
|
||||
Diag(Method->getLocation(), diag::err_member_function_initialization)
|
||||
|
|
|
@ -24,6 +24,16 @@ public:
|
|||
; // expected-warning{{extra ';' inside a class}}
|
||||
|
||||
virtual int vf() const volatile = 0;
|
||||
|
||||
virtual int vf0() = 0l; // expected-error {{does not look like a pure-specifier}}
|
||||
virtual int vf1() = 1; // expected-error {{does not look like a pure-specifier}}
|
||||
virtual int vf2() = 00; // expected-error {{does not look like a pure-specifier}}
|
||||
virtual int vf3() = 0x0; // expected-error {{does not look like a pure-specifier}}
|
||||
virtual int vf4() = 0.0; // expected-error {{does not look like a pure-specifier}}
|
||||
virtual int vf5(){0}; // expected-error +{{}} expected-warning {{unused}}
|
||||
virtual int vf5a(){0;}; // function definition, expected-warning {{unused}}
|
||||
virtual int vf6()(0); // expected-error +{{}} expected-note +{{}}
|
||||
virtual int vf7() = { 0 }; // expected-error {{does not look like a pure-specifier}}
|
||||
|
||||
private:
|
||||
int x,f(),y,g();
|
||||
|
|
Loading…
Reference in New Issue