Skip to content

Commit dfdb191

Browse files
committed
Move checking of id expressions out of the Parser
1 parent 45e8b00 commit dfdb191

File tree

6 files changed

+37
-28
lines changed

6 files changed

+37
-28
lines changed

src/parser/cxx/binder.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,4 +691,14 @@ auto Binder::instantiate(SimpleTemplateIdAST* templateId) -> Symbol* {
691691
return symbol;
692692
}
693693

694+
void Binder::bind(IdExpressionAST* ast) {
695+
if (ast->unqualifiedId) {
696+
auto name = get_name(control(), ast->unqualifiedId);
697+
const Name* componentName = name;
698+
if (auto templateId = name_cast<TemplateId>(name))
699+
componentName = templateId->name();
700+
ast->symbol = Lookup{scope()}(ast->nestedNameSpecifier, componentName);
701+
}
702+
}
703+
694704
} // namespace cxx

src/parser/cxx/binder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ class Binder {
125125

126126
void bind(TypeIdAST* ast, const Decl& decl);
127127

128+
void bind(IdExpressionAST* ast);
129+
128130
[[nodiscard]] auto instantiate(SimpleTemplateIdAST* templateId) -> Symbol*;
129131

130132
[[nodiscard]] auto resolve(NestedNameSpecifierAST* nestedNameSpecifier,

src/parser/cxx/parser.cc

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -836,29 +836,10 @@ auto Parser::parse_id_expression(IdExpressionAST*& yyast,
836836
ast->unqualifiedId = unqualifiedId;
837837
ast->isTemplateIntroduced = isTemplateIntroduced;
838838

839-
if (unqualifiedId) {
840-
auto name = get_name(control_, unqualifiedId);
841-
const Name* componentName = name;
842-
if (auto templateId = name_cast<TemplateId>(name))
843-
componentName = templateId->name();
844-
ast->symbol = Lookup{scope()}(nestedNameSpecifier, componentName);
845-
}
839+
binder_.bind(ast);
846840

847841
if (ctx == IdExpressionContext::kExpression) {
848-
if (ast->symbol) {
849-
if (auto conceptSymbol = symbol_cast<ConceptSymbol>(ast->symbol)) {
850-
ast->type = control_->getBoolType();
851-
ast->valueCategory = ValueCategory::kPrValue;
852-
} else {
853-
ast->type = control_->remove_reference(ast->symbol->type());
854-
855-
if (auto enumerator = symbol_cast<EnumeratorSymbol>(ast->symbol)) {
856-
ast->valueCategory = ValueCategory::kPrValue;
857-
} else {
858-
ast->valueCategory = ValueCategory::kLValue;
859-
}
860-
}
861-
}
842+
check(ast);
862843
}
863844

864845
return true;

src/parser/cxx/type_checker.cc

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,23 @@ void TypeChecker::Visitor::operator()(NestedExpressionAST* ast) {
239239
ast->valueCategory = ast->expression->valueCategory;
240240
}
241241

242-
void TypeChecker::Visitor::operator()(IdExpressionAST* ast) {}
242+
void TypeChecker::Visitor::operator()(IdExpressionAST* ast) {
243+
if (ast->symbol) {
244+
if (auto conceptSymbol = symbol_cast<ConceptSymbol>(ast->symbol)) {
245+
ast->type = control()->getBoolType();
246+
ast->valueCategory = ValueCategory::kPrValue;
247+
} else {
248+
ast->type = control()->remove_reference(ast->symbol->type());
249+
250+
if (ast->symbol->isEnumOrScopedEnum() ||
251+
ast->symbol->isNonTypeParameter()) {
252+
ast->valueCategory = ValueCategory::kPrValue;
253+
} else {
254+
ast->valueCategory = ValueCategory::kLValue;
255+
}
256+
}
257+
}
258+
}
243259

244260
void TypeChecker::Visitor::operator()(LambdaExpressionAST* ast) {}
245261

tests/unit_tests/ast/new_expression_01.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ auto make(void* where, T init) {
6363
// CHECK-NEXT: expression: new-expression
6464
// CHECK-NEXT: new-placement: new-placement
6565
// CHECK-NEXT: expression-list
66-
// CHECK-NEXT: id-expression [lvalue void*]
66+
// CHECK-NEXT: id-expression
6767
// CHECK-NEXT: unqualified-id: name-id
6868
// CHECK-NEXT: identifier: where
6969
// CHECK-NEXT: type-specifier-list
@@ -73,7 +73,7 @@ auto make(void* where, T init) {
7373
// CHECK-NEXT: new-initalizer: new-braced-initializer
7474
// CHECK-NEXT: braced-init-list: braced-init-list
7575
// CHECK-NEXT: expression-list
76-
// CHECK-NEXT: id-expression [lvalue T]
76+
// CHECK-NEXT: id-expression
7777
// CHECK-NEXT: unqualified-id: name-id
7878
// CHECK-NEXT: identifier: init
7979
// CHECK-NEXT: declaration-statement
@@ -90,7 +90,7 @@ auto make(void* where, T init) {
9090
// CHECK-NEXT: expression: new-expression
9191
// CHECK-NEXT: new-placement: new-placement
9292
// CHECK-NEXT: expression-list
93-
// CHECK-NEXT: id-expression [lvalue void*]
93+
// CHECK-NEXT: id-expression
9494
// CHECK-NEXT: unqualified-id: name-id
9595
// CHECK-NEXT: identifier: where
9696
// CHECK-NEXT: type-specifier-list
@@ -99,6 +99,6 @@ auto make(void* where, T init) {
9999
// CHECK-NEXT: identifier: T
100100
// CHECK-NEXT: new-initalizer: new-paren-initializer
101101
// CHECK-NEXT: expression-list
102-
// CHECK-NEXT: id-expression [lvalue T]
102+
// CHECK-NEXT: id-expression
103103
// CHECK-NEXT: unqualified-id: name-id
104104
// CHECK-NEXT: identifier: init

tests/unit_tests/ast/template_lambda_01.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ struct S {
8383
// CHECK-NEXT: return-statement
8484
// CHECK-NEXT: expression: binary-expression
8585
// CHECK-NEXT: op: +
86-
// CHECK-NEXT: left-expression: id-expression [lvalue T1]
86+
// CHECK-NEXT: left-expression: id-expression
8787
// CHECK-NEXT: unqualified-id: name-id
8888
// CHECK-NEXT: identifier: a
89-
// CHECK-NEXT: right-expression: id-expression [lvalue T2]
89+
// CHECK-NEXT: right-expression: id-expression
9090
// CHECK-NEXT: unqualified-id: name-id
9191
// CHECK-NEXT: identifier: b

0 commit comments

Comments
 (0)