mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Add @safeinfer to allow var to be used locally.
This commit is contained in:
@@ -3055,6 +3055,7 @@ static bool sema_analyse_attribute(SemaContext *context, ResolvedAttrData *attr_
|
||||
[ATTRIBUTE_PURE] = ATTR_CALL,
|
||||
[ATTRIBUTE_REFLECT] = ATTR_FUNC | ATTR_GLOBAL | ATTR_CONST | USER_DEFINED_TYPES,
|
||||
[ATTRIBUTE_SAFEMACRO] = ATTR_MACRO,
|
||||
[ATTRIBUTE_SAFEINFER] = ATTR_GLOBAL | ATTR_LOCAL,
|
||||
[ATTRIBUTE_SECTION] = ATTR_FUNC | ATTR_CONST | ATTR_GLOBAL,
|
||||
[ATTRIBUTE_STRUCTLIKE] = ATTR_DISTINCT,
|
||||
[ATTRIBUTE_TAG] = ATTR_BITSTRUCT_MEMBER | ATTR_MEMBER | USER_DEFINED_TYPES | CALLABLE_TYPE,
|
||||
@@ -3421,6 +3422,9 @@ static bool sema_analyse_attribute(SemaContext *context, ResolvedAttrData *attr_
|
||||
decl->attr_nopadding = true;
|
||||
decl->attr_compact = true;
|
||||
break;
|
||||
case ATTRIBUTE_SAFEINFER:
|
||||
decl->var.safe_infer = true;
|
||||
break;
|
||||
case ATTRIBUTE_NOINIT:
|
||||
decl->var.no_init = true;
|
||||
break;
|
||||
@@ -4651,9 +4655,9 @@ bool sema_analyse_var_decl(SemaContext *context, Decl *decl, bool local)
|
||||
return decl_poison(decl);
|
||||
}
|
||||
ASSERT(!decl->var.no_init);
|
||||
if (kind == VARDECL_LOCAL && !context_is_macro(context) && init_expr->expr_kind != EXPR_LAMBDA)
|
||||
if (kind == VARDECL_LOCAL && !context_is_macro(context) && init_expr->expr_kind != EXPR_LAMBDA && !decl->var.safe_infer)
|
||||
{
|
||||
SEMA_ERROR(decl, "Defining a variable using 'var %s = ...' is only allowed inside a macro, or when defining a lambda.", decl->name);
|
||||
SEMA_ERROR(decl, "Defining a variable using 'var %s = ...' is only allowed inside a macro, or when defining a lambda. You can override this by adding the attribute '@safeinfer' to the declaration.", decl->name);
|
||||
return decl_poison(decl);
|
||||
}
|
||||
if (!sema_analyse_expr(context, init_expr)) return decl_poison(decl);
|
||||
|
||||
Reference in New Issue
Block a user