summaryrefslogtreecommitdiff
path: root/src/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser')
-rw-r--r--src/parser/parser.h2
-rw-r--r--src/parser/parser_expr.c18
-rw-r--r--src/parser/parser_stmt.c2
3 files changed, 13 insertions, 9 deletions
diff --git a/src/parser/parser.h b/src/parser/parser.h
index f82edf4..5757fbc 100644
--- a/src/parser/parser.h
+++ b/src/parser/parser.h
@@ -430,7 +430,7 @@ ASTNode *parse_impl_trait(ParserContext *ctx, Lexer *l);
ASTNode *parse_test(ParserContext *ctx, Lexer *l);
// Move semantics helpers
-int is_type_copy(Type *t);
+int is_type_copy(ParserContext *ctx, Type *t);
void check_move_usage(ParserContext *ctx, ASTNode *node, Token t);
ASTNode *parse_include(ParserContext *ctx, Lexer *l);
ASTNode *parse_import(ParserContext *ctx, Lexer *l);
diff --git a/src/parser/parser_expr.c b/src/parser/parser_expr.c
index cc647c7..97d6218 100644
--- a/src/parser/parser_expr.c
+++ b/src/parser/parser_expr.c
@@ -9,7 +9,7 @@
Type *get_field_type(ParserContext *ctx, Type *struct_type, const char *field_name);
-int is_type_copy(Type *t)
+int is_type_copy(ParserContext *ctx, Type *t)
{
if (!t)
{
@@ -38,7 +38,11 @@ int is_type_copy(Type *t)
return 1;
case TYPE_STRUCT:
- // Structs are MOVE by default
+ // Structs are MOVE by default unless they implement Copy
+ if (check_impl(ctx, "Copy", t->name))
+ {
+ return 1;
+ }
return 0;
case TYPE_ARRAY:
@@ -1829,7 +1833,7 @@ ASTNode *parse_primary(ParserContext *ctx, Lexer *l)
}
}
- if (!is_type_copy(t))
+ if (!is_type_copy(ctx, t))
{
Symbol *s = find_symbol_entry(ctx, arg->var_ref.name);
if (s)
@@ -1960,7 +1964,7 @@ ASTNode *parse_primary(ParserContext *ctx, Lexer *l)
}
}
- if (!is_type_copy(t))
+ if (!is_type_copy(ctx, t))
{
Symbol *s = find_symbol_entry(ctx, arg->var_ref.name);
if (s)
@@ -2246,7 +2250,7 @@ ASTNode *parse_primary(ParserContext *ctx, Lexer *l)
}
}
- if (!is_type_copy(t))
+ if (!is_type_copy(ctx, t))
{
Symbol *s = find_symbol_entry(ctx, arg->var_ref.name);
if (s)
@@ -3347,7 +3351,7 @@ ASTNode *parse_expr_prec(ParserContext *ctx, Lexer *l, Precedence min_prec)
}
}
- if (!is_type_copy(t))
+ if (!is_type_copy(ctx, t))
{
Symbol *s = find_symbol_entry(ctx, arg->var_ref.name);
if (s)
@@ -3753,7 +3757,7 @@ ASTNode *parse_expr_prec(ParserContext *ctx, Lexer *l, Precedence min_prec)
}
}
- if (!is_type_copy(t))
+ if (!is_type_copy(ctx, t))
{
Symbol *s = find_symbol_entry(ctx, rhs->var_ref.name);
if (s)
diff --git a/src/parser/parser_stmt.c b/src/parser/parser_stmt.c
index 8fa0a1e..fc34a21 100644
--- a/src/parser/parser_stmt.c
+++ b/src/parser/parser_stmt.c
@@ -1248,7 +1248,7 @@ ASTNode *parse_var_decl(ParserContext *ctx, Lexer *l)
t = s->type_info;
}
}
- if (!is_type_copy(t))
+ if (!is_type_copy(ctx, t))
{
Symbol *s = find_symbol_entry(ctx, init->var_ref.name);
if (s)