aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-03-04 11:06:59 +0000
committergingerBill <bill@gingerbill.org>2018-03-04 11:06:59 +0000
commit105de7705a797e397b4cb8900f2c1f771684e2db (patch)
tree0896312734dd6d39ece0e191839595489b2ff725
parent584dffea1420b1e2ce98922f8dd5cf63e5fb8872 (diff)
Add `unselector_expr`
-rw-r--r--src/check_expr.cpp5
-rw-r--r--src/checker.cpp11
-rw-r--r--src/checker.hpp7
-rw-r--r--src/ir.cpp7
-rw-r--r--src/parser.cpp11
-rw-r--r--src/types.cpp4
6 files changed, 23 insertions, 22 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 94a710ada..925a69c43 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -1353,10 +1353,7 @@ void check_is_expressible(Checker *c, Operand *o, Type *type) {
bool check_is_not_addressable(Checker *c, Operand *o) {
if (o->mode == Addressing_OptionalOk) {
- AstNode *expr = unparen_expr(o->expr);
- while (expr->kind == AstNode_SelectorExpr) {
- expr = expr->SelectorExpr.selector;
- }
+ AstNode *expr = unselector_expr(o->expr);
if (expr->kind != AstNode_TypeAssertion) {
return true;
}
diff --git a/src/checker.cpp b/src/checker.cpp
index 73d9942b6..9d99b3a77 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -714,10 +714,7 @@ Entity *entity_of_node(CheckerInfo *i, AstNode *expr) {
return entity_of_ident(i, expr);
case_end;
case_ast_node(se, SelectorExpr, expr);
- AstNode *s = se->selector;
- while (s->kind == AstNode_SelectorExpr) {
- s = s->SelectorExpr.selector;
- }
+ AstNode *s = unselector_expr(se->selector);
if (s->kind == AstNode_Ident) {
return entity_of_ident(i, s);
}
@@ -3113,10 +3110,10 @@ void check_parsed_files(Checker *c) {
TIME_SECTION("add type information");
// Add "Basic" type information
- for (isize i = 0; i < gb_count_of(basic_types)-1; i++) {
+ for (isize i = 0; i < Basic_COUNT; i++) {
Type *t = &basic_types[i];
if (t->Basic.size > 0 &&
- t->Basic.kind != Basic_llvm_bool) {
+ (t->Basic.flags & BasicFlag_LLVM) == 0) {
add_type_info_type(c, t);
}
}
@@ -3133,7 +3130,7 @@ void check_parsed_files(Checker *c) {
}
}
- TIME_SECTION("check entry poiny");
+ TIME_SECTION("check entry point");
if (!build_context.is_dll) {
Scope *s = c->info.init_scope;
GB_ASSERT(s != nullptr);
diff --git a/src/checker.hpp b/src/checker.hpp
index 51c81b2a3..df3364f89 100644
--- a/src/checker.hpp
+++ b/src/checker.hpp
@@ -30,11 +30,8 @@ struct TypeAndValue {
// ExprInfo stores information used for "untyped" expressions
-struct ExprInfo {
- AddressingMode mode;
- Type * type; // Type_Basic
- ExactValue value;
- bool is_lhs; // Debug info
+struct ExprInfo : TypeAndValue {
+ bool is_lhs; // Debug info
};
gb_inline ExprInfo make_expr_info(AddressingMode mode, Type *type, ExactValue value, bool is_lhs) {
diff --git a/src/ir.cpp b/src/ir.cpp
index 74f51d727..211834519 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -4164,11 +4164,8 @@ irValue *ir_build_builtin_proc(irProcedure *proc, AstNode *expr, TypeAndValue tv
String procedure = proc->entity->token.string;
TokenPos pos = ast_node_token(ce->proc).pos;
if (ce->args.count > 0) {
- AstNode *ident = ce->args[0];;
-
- while (ident->kind == AstNode_SelectorExpr) {
- ident = ident->SelectorExpr.selector;
- }
+ AstNode *ident = unselector_expr(ce->args[0]);
+ GB_ASSERT(ident->kind == AstNode_Ident);
Entity *e = entity_of_ident(proc->module->info, ident);
GB_ASSERT(e != nullptr);
diff --git a/src/parser.cpp b/src/parser.cpp
index 85ae63556..f94a66cad 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -1410,6 +1410,17 @@ AstNode *unparen_expr(AstNode *node) {
}
}
+AstNode *unselector_expr(AstNode *node) {
+ node = unparen_expr(node);
+ if (node == nullptr) {
+ return nullptr;
+ }
+ while (node->kind == AstNode_SelectorExpr) {
+ node = node->SelectorExpr.selector;
+ }
+ return node;
+}
+
AstNode *parse_value(AstFile *f);
Array<AstNode *> parse_element_list(AstFile *f) {
diff --git a/src/types.cpp b/src/types.cpp
index 60eb39403..3e8d024e4 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -63,6 +63,8 @@ enum BasicFlag {
BasicFlag_Rune = GB_BIT(7),
BasicFlag_Untyped = GB_BIT(8),
+ BasicFlag_LLVM = GB_BIT(10),
+
BasicFlag_Numeric = BasicFlag_Integer | BasicFlag_Float | BasicFlag_Complex,
BasicFlag_Ordered = BasicFlag_Integer | BasicFlag_Float | BasicFlag_String | BasicFlag_Pointer | BasicFlag_Rune,
BasicFlag_ConstantType = BasicFlag_Boolean | BasicFlag_Numeric | BasicFlag_String | BasicFlag_Pointer | BasicFlag_Rune,
@@ -244,7 +246,7 @@ void selection_add_index(Selection *s, isize index) {
gb_global Type basic_types[] = {
{Type_Basic, {Basic_Invalid, 0, 0, STR_LIT("invalid type")}},
- {Type_Basic, {Basic_llvm_bool, BasicFlag_Boolean, 1, STR_LIT("llvm bool")}},
+ {Type_Basic, {Basic_llvm_bool, BasicFlag_Boolean | BasicFlag_LLVM, 1, STR_LIT("llvm bool")}},
{Type_Basic, {Basic_bool, BasicFlag_Boolean, 1, STR_LIT("bool")}},
{Type_Basic, {Basic_b8, BasicFlag_Boolean, 1, STR_LIT("b8")}},