]> Nishi Git Mirror - gwion.git/commitdiff
:art: Fix scan1 auto decl
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Thu, 21 May 2020 17:05:15 +0000 (19:05 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Thu, 21 May 2020 17:05:32 +0000 (19:05 +0200)
src/emit/emit.c
src/parse/check.c
src/parse/scan1.c

index 3263141fb855746eabc8d7d66b776f93c12e273c..0b2409e1e0307372dfd883ed7e3965790033258a 100644 (file)
@@ -622,7 +622,7 @@ ANN static m_bool emit_exp_decl_non_static(const Emitter emit, const Exp_Decl *d
   const m_bool is_array = (array && array->exp) || GET_FLAG(decl->td, force);
   const m_bool is_obj = isa(type, emit->gwion->type[et_object]) > 0;
   const uint emit_addr = (!is_obj || (is_ref && !is_array)) ? emit_var : 1;
-  if(is_obj && (is_array || !is_ref))
+  if(is_obj && (is_array || !is_ref) && !GET_FLAG(v, ref))
     CHECK_BB(emit_instantiate_object(emit, type, array, is_ref))
   f_instr *exec = (f_instr*)allocmember;
   if(!GET_FLAG(v, member)) {
@@ -636,7 +636,7 @@ ANN static m_bool emit_exp_decl_non_static(const Emitter emit, const Exp_Decl *d
   const Instr instr = !(SAFE_FLAG(emit->env->class_def, struct) && !emit->env->scope->depth) ?
     emit_kind(emit, v->type->size, !struct_ctor(v) ? emit_addr : 1, exec) : emit_struct_decl(emit, v, !struct_ctor(v) ? emit_addr : 1);
   instr->m_val = v->from->offset;
-  if(is_obj && (is_array || !is_ref)) {
+  if(is_obj && (is_array || !is_ref) && !GET_FLAG(v, ref)) {
     emit_add_instr(emit, Assign);
     const size_t missing_depth = type->array_depth - (array ? array->depth : 0);
     if(missing_depth && !GET_FLAG(decl->td, force)) {
@@ -659,14 +659,14 @@ ANN static m_bool emit_exp_decl_global(const Emitter emit, const Exp_Decl *decl,
   const m_bool is_array = array && array->exp;
   const m_bool is_obj = isa(type, emit->gwion->type[et_object]) > 0;
   const uint emit_addr = (!is_obj || (is_ref && !is_array)) ? emit_var : 1;
-  if(is_obj && (is_array || !is_ref))
+  if(is_obj && (is_array || !is_ref && !GET_FLAG(v, ref)))
     CHECK_BB(emit_instantiate_object(emit, type, array, is_ref))
   const Instr instr = emit_kind(emit, v->type->size, !struct_ctor(v) ? emit_addr : 1, dotstatic);
   v->d.ptr = mp_calloc2(emit->gwion->mp, v->type->size);
   SET_FLAG(v, union);
   instr->m_val = (m_uint)v->d.ptr;
   instr->m_val2 = v->type->size;
-  if(is_obj && (is_array || !is_ref)) {
+  if(is_obj && (is_array || !is_ref && !GET_FLAG(v, ref))) {
     const Instr assign = emit_add_instr(emit, Assign);
     const size_t missing_depth = type->array_depth - (array ? array->depth : 0);
     if(missing_depth && !GET_FLAG(decl->td, force)) {
index 69e9137c96620eec4ea412f78e9a30affd23920f..a066bbd250224cd2fb5ca3aaa13292035577dd8e 100644 (file)
@@ -157,6 +157,7 @@ ANN Type check_exp_decl(const Env env, const Exp_Decl* decl) {
     return no_xid(env, decl);
   if(decl->td->xid == insert_symbol("auto")) { // should be better
     clear_decl(env, decl);
+    SET_FLAG(decl->td, ref);
     CHECK_BO(scan1_exp(env, exp_self(decl)))
     CHECK_BO(scan2_exp(env, exp_self(decl)))
   }
index 81efcb9f284232fc52c891f1e9d569ebd01675cb..0f62b29d671ba3af060a443d3031c2cd2646334a 100644 (file)
@@ -74,7 +74,7 @@ ANN static m_bool scan1_decl(const Env env, const Exp_Decl* decl) {
     CHECK_BB(isres(env, var->xid, exp_self(decl)->pos))
     Type t = decl->type;
     const Value former = nspc_lookup_value0(env->curr, var->xid);
-    if(former && t != env->gwion->type[et_auto])
+    if(former)
       ERR_B(var->pos, _("variable %s has already been defined in the same scope..."),
               s_name(var->xid))
     if(var->array) {