mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-19 03:46:43 +00:00
Fix erroneous name-specifiers prior to decltypes better/correctly as per Doug's feedback.
llvm-svn: 142935
This commit is contained in:
parent
82b077ec22
commit
afa155fb88
@ -249,6 +249,8 @@ def err_missing_comma_before_ellipsis : Error<
|
||||
"C requires a comma prior to the ellipsis in a variadic function type">;
|
||||
def err_unexpected_typedef_ident : Error<
|
||||
"unexpected type name %0: expected identifier">;
|
||||
def err_unexpected_scope_on_base_decltype : Error<
|
||||
"unexpected namespace scope prior to decltype">;
|
||||
def err_expected_class_name : Error<"expected class name">;
|
||||
def err_unspecified_vla_size_with_static : Error<
|
||||
"'static' may not be used with an unspecified variable length array size">;
|
||||
|
@ -713,13 +713,20 @@ void Parser::ParseUnderlyingTypeSpecifier(DeclSpec &DS) {
|
||||
///
|
||||
Parser::TypeResult Parser::ParseBaseTypeSpecifier(SourceLocation &BaseLoc,
|
||||
SourceLocation &EndLocation) {
|
||||
// Parse optional nested-name-specifier
|
||||
CXXScopeSpec SS;
|
||||
ParseOptionalCXXScopeSpecifier(SS, ParsedType(), /*EnteringContext=*/false);
|
||||
|
||||
BaseLoc = Tok.getLocation();
|
||||
|
||||
// Parse decltype-specifier
|
||||
if (Tok.is(tok::kw_decltype)) {
|
||||
if (SS.isNotEmpty())
|
||||
Diag(SS.getBeginLoc(), diag::err_unexpected_scope_on_base_decltype)
|
||||
<< FixItHint::CreateRemoval(SS.getRange());
|
||||
// Fake up a Declarator to use with ActOnTypeName.
|
||||
DeclSpec DS(AttrFactory);
|
||||
|
||||
BaseLoc = Tok.getLocation();
|
||||
|
||||
ParseDecltypeSpecifier(DS);
|
||||
EndLocation = DS.getSourceRange().getEnd();
|
||||
|
||||
@ -727,12 +734,6 @@ Parser::TypeResult Parser::ParseBaseTypeSpecifier(SourceLocation &BaseLoc,
|
||||
return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);
|
||||
}
|
||||
|
||||
// Parse optional nested-name-specifier
|
||||
CXXScopeSpec SS;
|
||||
ParseOptionalCXXScopeSpecifier(SS, ParsedType(), /*EnteringContext=*/false);
|
||||
|
||||
BaseLoc = Tok.getLocation();
|
||||
|
||||
// Check whether we have a template-id that names a type.
|
||||
if (Tok.is(tok::annot_template_id)) {
|
||||
TemplateIdAnnotation *TemplateId = takeTemplateIdAnnotation(Tok);
|
||||
|
@ -31,7 +31,7 @@ namespace PR11216 {
|
||||
struct Foo { Base foo(); };
|
||||
Derived3<Foo> d;
|
||||
|
||||
struct Derived4 : :: decltype(Base()) { }; // expected-error {{expected class name}}
|
||||
struct Derived4 : :: decltype(Base()) { }; // expected-error {{unexpected namespace scope prior to decltype}}
|
||||
|
||||
struct Derived5 : PR11216:: decltype(Base()) { }; // expected-error {{expected class name}}
|
||||
struct Derived5 : PR11216:: decltype(Base()) { }; // expected-error {{unexpected namespace scope prior to decltype}}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user