@@ -3664,7 +3664,7 @@ auto Parser::parse_notypespec_function_definition(
3664
3664
3665
3665
const auto has_requires_clause = parse_requires_clause (requiresClause);
3666
3666
3667
- if (!has_requires_clause) parse_virt_specifier_seq ();
3667
+ if (!has_requires_clause) parse_virt_specifier_seq (functionDeclarator );
3668
3668
3669
3669
SourceLocation semicolonLoc;
3670
3670
@@ -5513,12 +5513,11 @@ auto Parser::parse_expr_or_braced_init_list(ExpressionAST*& yyast) -> bool {
5513
5513
return true ;
5514
5514
}
5515
5515
5516
- auto Parser::parse_virt_specifier_seq () -> bool {
5517
- SourceLocation finalLoc;
5518
-
5519
- if (!parse_virt_specifier (finalLoc)) return false ;
5516
+ auto Parser::parse_virt_specifier_seq (FunctionDeclaratorAST* functionDeclarator)
5517
+ -> bool {
5518
+ if (!parse_virt_specifier (functionDeclarator)) return false ;
5520
5519
5521
- while (parse_virt_specifier (finalLoc )) {
5520
+ while (parse_virt_specifier (functionDeclarator )) {
5522
5521
//
5523
5522
}
5524
5523
@@ -6996,12 +6995,14 @@ auto Parser::parse_member_declaration_helper(DeclarationAST*& yyast) -> bool {
6996
6995
6997
6996
const auto hasDeclarator = parse_declarator (declarator);
6998
6997
6999
- if (hasDeclarator && getFunctionDeclarator (declarator)) {
6998
+ auto functionDeclarator = getFunctionDeclarator (declarator);
6999
+
7000
+ if (hasDeclarator && functionDeclarator) {
7000
7001
RequiresClauseAST* requiresClause = nullptr ;
7001
7002
7002
7003
const auto has_requires_clause = parse_requires_clause (requiresClause);
7003
7004
7004
- if (!has_requires_clause) parse_virt_specifier_seq ();
7005
+ if (!has_requires_clause) parse_virt_specifier_seq (functionDeclarator );
7005
7006
7006
7007
if (lookat_function_body ()) {
7007
7008
FunctionBodyAST* functionBody = nullptr ;
@@ -7125,14 +7126,20 @@ auto Parser::parse_member_declarator(InitDeclaratorAST*& yyast,
7125
7126
7126
7127
ast->declarator = declarator;
7127
7128
7128
- if (getFunctionDeclarator (declarator)) {
7129
+ if (auto functionDeclarator = getFunctionDeclarator (declarator)) {
7129
7130
RequiresClauseAST* requiresClause = nullptr ;
7130
7131
7131
7132
if (parse_requires_clause (requiresClause)) {
7132
7133
ast->requiresClause = requiresClause;
7133
7134
} else {
7134
- parse_virt_specifier_seq ();
7135
- parse_pure_specifier ();
7135
+ parse_virt_specifier_seq (functionDeclarator);
7136
+
7137
+ SourceLocation equalLoc;
7138
+ SourceLocation zeroLoc;
7139
+
7140
+ const auto isPure = parse_pure_specifier (equalLoc, zeroLoc);
7141
+
7142
+ functionDeclarator->isPure = isPure;
7136
7143
}
7137
7144
7138
7145
return true ;
@@ -7143,24 +7150,30 @@ auto Parser::parse_member_declarator(InitDeclaratorAST*& yyast,
7143
7150
return true ;
7144
7151
}
7145
7152
7146
- auto Parser::parse_virt_specifier (SourceLocation& loc) -> bool {
7147
- if (parse_final (loc)) return true ;
7153
+ auto Parser::parse_virt_specifier (FunctionDeclaratorAST* functionDeclarator)
7154
+ -> bool {
7155
+ SourceLocation loc;
7156
+
7157
+ if (parse_final (loc)) {
7158
+ functionDeclarator->isFinal = true ;
7159
+ return true ;
7160
+ }
7148
7161
7149
- if (parse_override (loc)) return true ;
7162
+ if (parse_override (loc)) {
7163
+ functionDeclarator->isOverride = true ;
7164
+ return true ;
7165
+ }
7150
7166
7151
7167
return false ;
7152
7168
}
7153
7169
7154
- auto Parser::parse_pure_specifier () -> bool {
7155
- SourceLocation equalLoc;
7156
-
7170
+ auto Parser::parse_pure_specifier (SourceLocation& equalLoc,
7171
+ SourceLocation& zeroLoc) -> bool {
7157
7172
if (!match (TokenKind::T_EQUAL, equalLoc)) return false ;
7158
7173
7159
- SourceLocation literalLoc;
7160
-
7161
- if (!match (TokenKind::T_INTEGER_LITERAL, literalLoc)) return false ;
7174
+ if (!match (TokenKind::T_INTEGER_LITERAL, zeroLoc)) return false ;
7162
7175
7163
- const auto & number = unit->tokenText (literalLoc );
7176
+ const auto & number = unit->tokenText (zeroLoc );
7164
7177
7165
7178
if (number != " 0" ) return false ;
7166
7179
0 commit comments