]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Add error message to env_storage (thanks quibono :smile:)
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 6 Apr 2022 16:13:05 +0000 (18:13 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 6 Apr 2022 16:13:05 +0000 (18:13 +0200)
src/env/env_utils.c
src/parse/scan1.c
src/parse/scan2.c
tests/error/global_in_class.gw [new file with mode: 0644]
tests/error/invalid_global_class.gw
tests/error/invalid_global_file.gw
tests/error/lambda_mismatch1.gw

index d23f9f69f8d21768a39059092f922437106be17c..6e786b87319a269436d7a80c8ed22fbbe079ed40 100644 (file)
@@ -9,19 +9,21 @@
 ANN m_bool env_access(const Env env, const ae_flag flag, const loc_t pos) {
   if (env->scope->depth) {
     if (GET(flag, ae_flag_global))
-      ERR_B(pos, _("'global' can only be used at %s scope."),
+      ERR_B(pos, _("`{G}global{0}` can only be used at %s scope."),
             GET(flag, ae_flag_global) && !env->class_def ? "file" : "class")
   }
   if ((GET(flag, ae_flag_static) || GET(flag, ae_flag_private) ||
        GET(flag, ae_flag_protect)) &&
       (!env->class_def || env->scope->depth))
-    ERR_B(pos, _("static/private/protect can only be used at class scope."))
+    ERR_B(pos, _("`{G}static/private/protect{0}` can only be used at class scope."))
   return GW_OK;
 }
 
 ANN m_bool env_storage(const Env env, ae_flag flag, const loc_t pos) {
   CHECK_BB(env_access(env, flag, pos));
-  return !(env->class_def && GET(flag, ae_flag_global)) ? GW_OK : GW_ERROR;
+  if(env->class_def && GET(flag, ae_flag_global))
+    ERR_B(pos, _("`{G}global{0}` at class scope only valid for function pointers"));
+  return GW_OK;
 }
 #undef GET
 
index a18ccf2912d173fa425fa58117b617ebce0bdb80..2a31cf947b370467e3d238cf5c15becffa128e5c 100644 (file)
@@ -234,9 +234,14 @@ ANN static m_bool scan1_exp_if(const Env env, const Exp_If *exp_if) {
 }
 
 ANN static inline m_bool scan1_exp_unary(const restrict Env env,
-                                         const Exp_Unary *  unary) {
+                                         Exp_Unary *const  unary) {
   if (unary->unary_type == unary_code) {
-    RET_NSPC(scan1_stmt(env, unary->code))
+    const loc_t pos = exp_self(unary)->pos;
+    const Symbol sym = lambda_name(env->gwion->st, pos.first);
+    Exp lambda = new_exp_lambda(env->gwion->mp, sym, NULL, unary->code, pos);
+    mp_free(env->gwion->mp, Stmt, unary->code);
+    unary->exp = new_exp_call(env->gwion->mp, lambda, NULL, pos);
+    unary->unary_type = unary_exp;
   }
   return unary->unary_type == unary_exp ? scan1_exp(env, unary->exp) : GW_OK;
 }
index d497130187584f88fee8a97b4fd22b505efde1c8..1a8c663efde429d5775b0e23de5f0b11d9191c2a 100644 (file)
@@ -179,9 +179,7 @@ ANN static inline m_bool scan2_exp_if(const Env env, const Exp_If *exp_if) {
 }
 
 ANN static m_bool scan2_exp_unary(const Env env, const Exp_Unary *unary) {
-  if (unary->unary_type == unary_code) {
-    RET_NSPC(scan2_stmt(env, unary->code))
-  } else if (unary->unary_type == unary_exp)
+  if (unary->unary_type == unary_exp)
     return scan2_exp(env, unary->exp);
   return GW_OK;
 }
diff --git a/tests/error/global_in_class.gw b/tests/error/global_in_class.gw
new file mode 100644 (file)
index 0000000..51ef9b8
--- /dev/null
@@ -0,0 +1,4 @@
+#! [contains] at class scope only valid for function pointers
+class global C {
+  var global Event ev;
+}
index d9841a826045311ba5eeb986db7f6f4385c9a554..fe8da9194f1c5698de0825c85a2d9010c9cb199c 100644 (file)
@@ -1,4 +1,4 @@
-#! [contains] 'global' can only be used at class scope
+#! [contains] can only be used at class scope
 class C {
   {
     var global int i;
index 14981d1386bdc8176ea01d997acbea945692f701..93a9ec7cb79cfaa7f656346855d4c6a21a80a7cf 100644 (file)
@@ -1,4 +1,4 @@
-#! [contains] 'global' can only be used at file scope
+#! [contains] can only be used at file scope
 {
 var global int i;
 }
index 5635d4cf7ddcde78f573d0e1e1eb61928c499861..1a35c4edaa13ab2e4f99139d99244798e6217163 100644 (file)
@@ -1,2 +1,2 @@
-#! [contains] argument number does not match for lambda
+#! [contains] not enough arguments for lambda
 \a b { <<< a, " ", b >>>; }(1);