diff --git a/src/compiler/sema_expr.c b/src/compiler/sema_expr.c index 25a379e5f..be6c7eed9 100644 --- a/src/compiler/sema_expr.c +++ b/src/compiler/sema_expr.c @@ -3655,10 +3655,6 @@ CHECK_DEEPER: return true; } Decl *private = NULL; - if (strcmp(kw, "put_all_for_create") == 0) - { - int x = 123; - } if (!member) { Decl *ambiguous = NULL; @@ -5271,6 +5267,10 @@ static const char *sema_addr_check_may_take(Expr *inner) if (inner->unary_expr.operator == UNARYOP_DEREF) return NULL; break; case EXPR_ACCESS: + if (inner->access_expr.ref->decl_kind == DECL_FUNC) + { + return "Taking the address of a method should be done through the type e.g. '&Foo.method' not through the value."; + } return sema_addr_check_may_take(inner->access_expr.parent); case EXPR_GROUP: return sema_addr_check_may_take(inner->inner_expr); diff --git a/src/version.h b/src/version.h index caf237866..c0fdb0669 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define COMPILER_VERSION "0.4.65" \ No newline at end of file +#define COMPILER_VERSION "0.4.66" \ No newline at end of file diff --git a/test/test_suite/methods/method_from_var.c3 b/test/test_suite/methods/method_from_var.c3 new file mode 100644 index 000000000..7ad0ea6d5 --- /dev/null +++ b/test/test_suite/methods/method_from_var.c3 @@ -0,0 +1,9 @@ +define NodeNotifyHandler = fn void(TreeView* this, TreeNode* node, String prop, void* data); +private fn void TreeView.nodeNotifyHandler(TreeView* this, TreeNode* node, String prop, void* data) {} + +struct TreeNode { int abc; NodeNotifyHandler notifyHandler; } +struct TreeView { int abc; } +private fn void TreeView.addNodeInternal(TreeView* this, int nop, TreeNode* node, TreeNode* pnode = null, int pos = -1) +{ + node.notifyHandler = &(this.nodeNotifyHandler); // #error: Taking the address of a method +} \ No newline at end of file