Browse Source

Only check idents in the alias (of alias)+ problem

gingerBill 3 years ago
parent
commit
d5384c5aa4
3 changed files with 4 additions and 4 deletions
  1. 1 1
      src/check_decl.cpp
  2. 2 2
      src/check_expr.cpp
  3. 1 1
      src/checker.cpp

+ 1 - 1
src/check_decl.cpp

@@ -385,7 +385,7 @@ void check_const_decl(CheckerContext *ctx, Entity *e, Ast *type_expr, Ast *init,
 	Operand operand = {};
 
 	if (init != nullptr) {
-		Entity *entity = check_entity_from_ident_or_selector(ctx, init);
+		Entity *entity = check_entity_from_ident_or_selector(ctx, init, false);
 		if (entity != nullptr && entity->kind == Entity_TypeName) {
 			// @TypeAliasingProblem
 			// NOTE(bill, 2022-02-03): This is used to solve the problem caused by type aliases

+ 2 - 2
src/check_expr.cpp

@@ -4082,11 +4082,11 @@ bool is_entity_declared_for_selector(Entity *entity, Scope *import_scope, bool *
 }
 
 // NOTE(bill, 2022-02-03): see `check_const_decl` for why it exists reasoning
-Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast *node) {
+Entity *check_entity_from_ident_or_selector(CheckerContext *c, Ast *node, bool ident_only) {
 	if (node->kind == Ast_Ident) {
 		String name = node->Ident.token.string;
 		return scope_lookup(c->scope, name);
-	} else if (node->kind == Ast_SelectorExpr) {
+	} else if (!ident_only) if (node->kind == Ast_SelectorExpr) {
 		ast_node(se, SelectorExpr, node);
 		if (se->token.kind == Token_ArrowRight) {
 			return nullptr;

+ 1 - 1
src/checker.cpp

@@ -3670,7 +3670,7 @@ bool correct_single_type_alias(CheckerContext *c, Entity *e) {
 		DeclInfo *d = e->decl_info;
 		if (d != nullptr && d->init_expr != nullptr) {
 			Ast *init = d->init_expr;
-			Entity *alias_of = check_entity_from_ident_or_selector(c, init);
+			Entity *alias_of = check_entity_from_ident_or_selector(c, init, true);
 			if (alias_of != nullptr && alias_of->kind == Entity_TypeName) {
 				e->kind = Entity_TypeName;
 				return true;