@@ -744,40 +744,6 @@ struct Parser::ClassSpecifierContext {
744744 }
745745};
746746
747- struct Parser ::DeclareSymbol {
748- Parser* p;
749- Scope* scope_;
750-
751- explicit DeclareSymbol (Parser* p, Scope* scope) : p(p), scope_(scope) {}
752-
753- auto control () const -> Control* { return p->control_ ; }
754-
755- void operator ()(Symbol* symbol) {
756- if (auto f = symbol_cast<FunctionSymbol>(symbol)) {
757- for (Symbol* candidate : scope_->find (symbol->name ())) {
758- if (auto currentFunction = symbol_cast<FunctionSymbol>(candidate)) {
759- auto ovl =
760- control ()->newOverloadSetSymbol (candidate->enclosingScope (), {});
761- ovl->setName (symbol->name ());
762- scope_->replaceSymbol (currentFunction, ovl);
763-
764- ovl->addFunction (currentFunction);
765- ovl->addFunction (f);
766-
767- return ;
768- }
769-
770- if (auto ovl = symbol_cast<OverloadSetSymbol>(candidate)) {
771- ovl->addFunction (f);
772- return ;
773- }
774- }
775- }
776-
777- scope_->addSymbol (symbol);
778- }
779- };
780-
781747Parser::Parser (TranslationUnit* unit) : unit(unit) {
782748 control_ = unit->control ();
783749 diagnosticClient_ = unit->diagnosticsClient ();
@@ -1778,16 +1744,15 @@ auto Parser::parse_lambda_expression(ExpressionAST*& yyast) -> bool {
17781744
17791745 if (auto params = ast->parameterDeclarationClause ) {
17801746 auto lambdaScope = symbol->scope ();
1781- std::invoke (DeclareSymbol{this , lambdaScope},
1782- params->functionParametersSymbol );
1747+ lambdaScope->addSymbol (params->functionParametersSymbol );
17831748 setScope (params->functionParametersSymbol );
17841749 } else {
17851750 setScope (symbol);
17861751 }
17871752
17881753 if (!lookat (TokenKind::T_LBRACE)) return false ;
17891754
1790- std::invoke (DeclareSymbol{ this , scope_}, symbol);
1755+ scope_-> addSymbol ( symbol);
17911756
17921757 if (!parse_compound_statement (ast->statement )) {
17931758 parse_error (" expected a compound statement" );
@@ -3821,7 +3786,7 @@ void Parser::parse_init_statement(StatementAST*& yyast) {
38213786 for (auto initDeclaraotr :
38223787 ListView (simpleDeclaration->initDeclaratorList )) {
38233788 auto symbol = initDeclaraotr->symbol ;
3824- std::invoke (DeclareSymbol{ this , scope_}, symbol);
3789+ scope_-> addSymbol ( symbol);
38253790 }
38263791 }
38273792
@@ -3986,7 +3951,7 @@ auto Parser::parse_compound_statement(CompoundStatementAST*& yyast, bool skip)
39863951 ScopeGuard scopeGuard{this };
39873952
39883953 auto blockSymbol = control_->newBlockSymbol (scope_, lbraceLoc);
3989- std::invoke (DeclareSymbol{ this , scope_}, blockSymbol);
3954+ scope_-> addSymbol ( blockSymbol);
39903955 setScope (blockSymbol);
39913956
39923957 auto ast = make_node<CompoundStatementAST>(pool_);
@@ -4070,7 +4035,7 @@ auto Parser::parse_if_statement(StatementAST*& yyast) -> bool {
40704035 ScopeGuard scopeGuard{this };
40714036
40724037 auto blockSymbol = control_->newBlockSymbol (scope_, ifLoc);
4073- std::invoke (DeclareSymbol{ this , scope_}, blockSymbol);
4038+ scope_-> addSymbol ( blockSymbol);
40744039 setScope (blockSymbol);
40754040
40764041 if (LA ().isOneOf (TokenKind::T_EXCLAIM, TokenKind::T_CONSTEVAL)) {
@@ -4153,7 +4118,7 @@ auto Parser::parse_while_statement(StatementAST*& yyast) -> bool {
41534118 ScopeGuard scopeGuard{this };
41544119
41554120 auto blockSymbol = control_->newBlockSymbol (scope_, whileLoc);
4156- std::invoke (DeclareSymbol{ this , scope_}, blockSymbol);
4121+ scope_-> addSymbol ( blockSymbol);
41574122 setScope (blockSymbol);
41584123
41594124 auto ast = make_node<WhileStatementAST>(pool_);
@@ -4224,7 +4189,7 @@ auto Parser::parse_for_range_statement(StatementAST*& yyast) -> bool {
42244189
42254190 lookahead.commit ();
42264191
4227- std::invoke (DeclareSymbol{ this , scope_}, blockSymbol);
4192+ scope_-> addSymbol ( blockSymbol);
42284193
42294194 auto ast = make_node<ForRangeStatementAST>(pool_);
42304195 yyast = ast;
@@ -4254,7 +4219,7 @@ auto Parser::parse_for_statement(StatementAST*& yyast) -> bool {
42544219 ScopeGuard scopeGuard{this };
42554220
42564221 auto blockSymbol = control_->newBlockSymbol (scope_, forLoc);
4257- std::invoke (DeclareSymbol{ this , scope_}, blockSymbol);
4222+ scope_-> addSymbol ( blockSymbol);
42584223 setScope (blockSymbol);
42594224
42604225 auto ast = make_node<ForStatementAST>(pool_);
@@ -4602,7 +4567,7 @@ auto Parser::enterOrCreateNamespace(const Identifier* identifier,
46024567
46034568 namespaceSymbol->setInline (isInline);
46044569
4605- std::invoke (DeclareSymbol{ this , parentScope}, namespaceSymbol);
4570+ parentScope-> addSymbol ( namespaceSymbol);
46064571
46074572 if (isInline || !namespaceSymbol->name ()) {
46084573 parentNamespace->scope ()->addUsingDirective (namespaceSymbol->scope ());
@@ -4903,8 +4868,7 @@ auto Parser::parse_simple_declaration(
49034868
49044869 if (auto params = functionDeclarator->parameterDeclarationClause ) {
49054870 auto functionScope = functionSymbol->scope ();
4906- std::invoke (DeclareSymbol{this , functionScope},
4907- params->functionParametersSymbol );
4871+ functionScope->addSymbol (params->functionParametersSymbol );
49084872 setScope (params->functionParametersSymbol );
49094873 } else {
49104874 setScope (functionSymbol);
@@ -5064,8 +5028,7 @@ auto Parser::parse_notypespec_function_definition(
50645028
50655029 if (auto params = functionDeclarator->parameterDeclarationClause ) {
50665030 auto functionScope = functionSymbol->scope ();
5067- std::invoke (DeclareSymbol{this , functionScope},
5068- params->functionParametersSymbol );
5031+ functionScope->addSymbol (params->functionParametersSymbol );
50695032 setScope (params->functionParametersSymbol );
50705033 } else {
50715034 setScope (functionSymbol);
@@ -7415,7 +7378,7 @@ auto Parser::parse_parameter_declaration(ParameterDeclarationAST*& yyast,
74157378 control_->newParameterSymbol (scope_, decl.location ());
74167379 parameterSymbol->setName (ast->identifier );
74177380 parameterSymbol->setType (ast->type );
7418- std::invoke (DeclareSymbol{ this , scope_}, parameterSymbol);
7381+ scope_-> addSymbol ( parameterSymbol);
74197382 }
74207383
74217384 if (match (TokenKind::T_EQUAL, ast->equalLoc )) {
@@ -7767,7 +7730,7 @@ auto Parser::parse_enum_specifier(SpecifierAST*& yyast, DeclSpecs& specs)
77677730
77687731 enumSymbol->setName (enumName);
77697732 enumSymbol->setUnderlyingType (underlyingType);
7770- std::invoke (DeclareSymbol{ this , scope_}, enumSymbol);
7733+ scope_-> addSymbol ( enumSymbol);
77717734
77727735 setScope (enumSymbol);
77737736 } else {
@@ -7776,7 +7739,7 @@ auto Parser::parse_enum_specifier(SpecifierAST*& yyast, DeclSpecs& specs)
77767739
77777740 enumSymbol->setName (enumName);
77787741 enumSymbol->setUnderlyingType (underlyingType);
7779- std::invoke (DeclareSymbol{ this , scope_}, enumSymbol);
7742+ scope_-> addSymbol ( enumSymbol);
77807743
77817744 setScope (enumSymbol);
77827745 }
@@ -7935,7 +7898,7 @@ void Parser::parse_enumerator(EnumeratorAST*& yyast, const Type* type) {
79357898 enumeratorSymbol->setType (type);
79367899 enumeratorSymbol->setValue (value);
79377900
7938- std::invoke (DeclareSymbol{ this , scope_}, enumeratorSymbol);
7901+ scope_-> addSymbol ( enumeratorSymbol);
79397902
79407903 if (auto enumSymbol = symbol_cast<EnumSymbol>(scope_->owner ())) {
79417904 auto enumeratorSymbol =
@@ -7945,7 +7908,7 @@ void Parser::parse_enumerator(EnumeratorAST*& yyast, const Type* type) {
79457908 enumeratorSymbol->setValue (value);
79467909
79477910 auto parentScope = enumSymbol->enclosingScope ();
7948- std::invoke (DeclareSymbol{ this , parentScope}, enumeratorSymbol);
7911+ parentScope-> addSymbol ( enumeratorSymbol);
79497912 }
79507913}
79517914
@@ -8283,7 +8246,7 @@ auto Parser::parse_using_declarator(UsingDeclaratorAST*& yyast) -> bool {
82838246 symbol->setDeclarator (yyast);
82848247 symbol->setTarget (target);
82858248
8286- std::invoke (DeclareSymbol{ this , scope_}, symbol);
8249+ scope_-> addSymbol ( symbol);
82878250
82888251 return true ;
82898252}
@@ -9255,7 +9218,7 @@ auto Parser::parse_class_head(ClassHead& classHead) -> bool {
92559218 classSymbol->setName (identifier);
92569219 classSymbol->setTemplateParameters (currentTemplateParameters ());
92579220
9258- std::invoke (DeclareSymbol{ this , declaringScope ()}, classSymbol);
9221+ declaringScope ()-> addSymbol ( classSymbol);
92599222 }
92609223
92619224 classHead.symbol = classSymbol;
@@ -9424,8 +9387,7 @@ auto Parser::parse_member_declaration_helper(DeclarationAST*& yyast) -> bool {
94249387
94259388 if (auto params = functionDeclarator->parameterDeclarationClause ) {
94269389 auto functionScope = functionSymbol->scope ();
9427- std::invoke (DeclareSymbol{this , functionScope},
9428- params->functionParametersSymbol );
9390+ functionScope->addSymbol (params->functionParametersSymbol );
94299391 setScope (params->functionParametersSymbol );
94309392 } else {
94319393 setScope (functionSymbol);
@@ -9564,25 +9526,26 @@ auto Parser::declareTypeAlias(SourceLocation identifierLoc, TypeIdAST* typeId)
95649526 symbol->setName (name);
95659527 if (typeId) symbol->setType (typeId->type );
95669528 symbol->setTemplateParameters (currentTemplateParameters ());
9567- std::invoke (DeclareSymbol{ this , declaringScope ()}, symbol);
9529+ declaringScope ()-> addSymbol ( symbol);
95689530 return symbol;
95699531}
95709532
95719533auto Parser::declareTypedef (DeclaratorAST* declarator, const Decl& decl)
95729534 -> TypeAliasSymbol* {
95739535 auto name = decl.getName ();
95749536 auto type = GetDeclaratorType{this }(declarator, decl.specs .getType ());
9575- auto typedefSymbol = control_->newTypeAliasSymbol (scope_, decl.location ());
9576- typedefSymbol ->setName (name);
9577- typedefSymbol ->setType (type);
9578- std::invoke (DeclareSymbol{ this , scope_}, typedefSymbol );
9579- return typedefSymbol ;
9537+ auto symbol = control_->newTypeAliasSymbol (scope_, decl.location ());
9538+ symbol ->setName (name);
9539+ symbol ->setType (type);
9540+ scope_-> addSymbol (symbol );
9541+ return symbol ;
95809542}
95819543
95829544auto Parser::declareFunction (DeclaratorAST* declarator, const Decl& decl)
95839545 -> FunctionSymbol* {
95849546 auto name = decl.getName ();
95859547 auto type = GetDeclaratorType{this }(declarator, decl.specs .getType ());
9548+
95869549 auto functionSymbol = control_->newFunctionSymbol (scope_, decl.location ());
95879550 applySpecifiers (functionSymbol, decl.specs );
95889551 functionSymbol->setName (name);
@@ -9595,8 +9558,31 @@ auto Parser::declareFunction(DeclaratorAST* declarator, const Decl& decl)
95959558 if (enclosingClass) {
95969559 enclosingClass->addConstructor (functionSymbol);
95979560 }
9561+
9562+ return functionSymbol;
9563+ }
9564+
9565+ auto scope = declaringScope ();
9566+
9567+ OverloadSetSymbol* overloadSet = nullptr ;
9568+
9569+ for (Symbol* candidate : scope->find (functionSymbol->name ())) {
9570+ overloadSet = symbol_cast<OverloadSetSymbol>(candidate);
9571+ if (overloadSet) break ;
9572+
9573+ if (auto previousFunction = symbol_cast<FunctionSymbol>(candidate)) {
9574+ overloadSet = control_->newOverloadSetSymbol (scope, {});
9575+ overloadSet->setName (functionSymbol->name ());
9576+ overloadSet->addFunction (previousFunction);
9577+ scope_->replaceSymbol (previousFunction, overloadSet);
9578+ break ;
9579+ }
9580+ }
9581+
9582+ if (overloadSet) {
9583+ overloadSet->addFunction (functionSymbol);
95989584 } else {
9599- std::invoke (DeclareSymbol{ this , declaringScope ()}, functionSymbol);
9585+ scope-> addSymbol ( functionSymbol);
96009586 }
96019587
96029588 return functionSymbol;
@@ -9610,7 +9596,7 @@ auto Parser::declareField(DeclaratorAST* declarator, const Decl& decl)
96109596 applySpecifiers (fieldSymbol, decl.specs );
96119597 fieldSymbol->setName (name);
96129598 fieldSymbol->setType (type);
9613- std::invoke (DeclareSymbol{ this , scope_}, fieldSymbol);
9599+ scope_-> addSymbol ( fieldSymbol);
96149600 return fieldSymbol;
96159601}
96169602
@@ -9624,7 +9610,7 @@ auto Parser::declareVariable(DeclaratorAST* declarator, const Decl& decl,
96249610 symbol->setType (type);
96259611 symbol->setTemplateParameters (currentTemplateParameters ());
96269612 if (ctx != BindingContext::kInitStatement ) {
9627- std::invoke (DeclareSymbol{ this , declaringScope ()}, symbol);
9613+ declaringScope ()-> addSymbol ( symbol);
96289614 }
96299615 return symbol;
96309616}
@@ -10397,7 +10383,7 @@ void Parser::parse_template_parameter(TemplateParameterAST*& yyast) {
1039710383 symbol->setName (parameter->identifier );
1039810384 symbol->setParameterPack (parameter->isPack );
1039910385 symbol->setObjectType (parameter->type );
10400- std::invoke (DeclareSymbol{ this , scope_}, symbol);
10386+ scope_-> addSymbol ( symbol);
1040110387
1040210388 auto ast = make_node<NonTypeTemplateParameterAST>(pool_);
1040310389 yyast = ast;
@@ -10454,7 +10440,7 @@ auto Parser::parse_typename_type_parameter(TemplateParameterAST*& yyast)
1045410440 symbol->setDepth (templateParameterDepth_);
1045510441 symbol->setParameterPack (isPack);
1045610442 symbol->setName (ast->identifier );
10457- std::invoke (DeclareSymbol{ this , scope_}, symbol);
10443+ scope_-> addSymbol ( symbol);
1045810444
1045910445 ast->symbol = symbol;
1046010446
@@ -10515,7 +10501,7 @@ void Parser::parse_template_type_parameter(TemplateParameterAST*& yyast) {
1051510501 mark_maybe_template_name (ast->identifier );
1051610502 }
1051710503
10518- std::invoke (DeclareSymbol{ this , scope_}, symbol);
10504+ scope_-> addSymbol ( symbol);
1051910505
1052010506 if (match (TokenKind::T_EQUAL, ast->equalLoc )) {
1052110507 if (!parse_id_expression (ast->idExpression ,
@@ -10564,7 +10550,7 @@ auto Parser::parse_constraint_type_parameter(TemplateParameterAST*& yyast)
1056410550 symbol->setIndex (templateParameterCount_);
1056510551 symbol->setDepth (templateParameterDepth_);
1056610552 symbol->setName (ast->identifier );
10567- std::invoke (DeclareSymbol{ this , scope_}, symbol);
10553+ scope_-> addSymbol ( symbol);
1056810554
1056910555 return true ;
1057010556}
@@ -10972,7 +10958,7 @@ auto Parser::parse_concept_definition(DeclarationAST*& yyast) -> bool {
1097210958 symbol->setName (ast->identifier );
1097310959 symbol->setTemplateParameters (templateParameters);
1097410960
10975- std::invoke (DeclareSymbol{ this , declaringScope ()}, symbol);
10961+ declaringScope ()-> addSymbol ( symbol);
1097610962
1097710963 if (ast->identifierLoc ) {
1097810964 concept_names_.insert (ast->identifier );
0 commit comments