]> Nishi Git Mirror - gwion.git/commitdiff
:art: '?:' and precedence
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sun, 14 Jul 2019 20:46:33 +0000 (22:46 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sun, 14 Jul 2019 20:46:33 +0000 (22:46 +0200)
ast
src/emit/emit.c
src/parse/check.c
src/parse/scan1.c
src/parse/scan2.c

diff --git a/ast b/ast
index 3cbaf19df28f60ce7b3bb5b0cb3d867902782f88..2a9afe545081756266000246a32193648f9b9618 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit 3cbaf19df28f60ce7b3bb5b0cb3d867902782f88
+Subproject commit 2a9afe545081756266000246a32193648f9b9618
index 617933aa22bcf731f4ff34b7ce94cdabe03acc05..a63e0081f35067f4fb00686e3340c0d9449d6f06 100644 (file)
@@ -1030,7 +1030,7 @@ ANN static Instr emit_flow(const Emitter emit, const Type type,
 ANN static m_bool emit_exp_if(const Emitter emit, const Exp_If* exp_if) {
   CHECK_BB(emit_exp(emit, exp_if->cond, 0))
   const Instr op = emit_flow(emit, exp_if->cond->type, BranchEqInt, BranchEqFloat);
-  CHECK_BB(emit_exp(emit, exp_if->if_exp, 0))
+  CHECK_BB(emit_exp(emit, exp_if->if_exp ?: exp_if->cond, 0))
   const Instr op2 = emit_add_instr(emit, Goto);
   op->m_val = emit_code_size(emit);
   const m_bool ret = emit_exp(emit, exp_if->else_exp, 0);
index a4a76ec17e73e0916ab96aa8ef02de2f5d72291f..30fc2136e51178617d37424be4d6774eeddc3ba7 100644 (file)
@@ -752,7 +752,7 @@ ANN static Type check_exp_unary(const Env env, const Exp_Unary* unary) {
 
 ANN static Type check_exp_if(const Env env, const Exp_If* exp_if) {
   DECL_OO(const Type, cond, = check_exp(env, exp_if->cond))
-  DECL_OO(const Type, if_exp, = check_exp(env, exp_if->if_exp))
+  DECL_OO(const Type, if_exp, = (exp_if->if_exp ? check_exp(env, exp_if->if_exp) : cond))
   DECL_OO(const Type, else_exp, = check_exp(env, exp_if->else_exp))
   if(isa(cond, t_int) < 0 && isa(cond, t_float) < 0 && isa(cond, t_object) < 0)
     ERR_O(exp_self(exp_if)->pos,
index 7e8cc596c5f7ae2d1d2dce02b1aac4ba69ea3e47..f64d1401bd53619a578c2e4b5f5014a5fd558eaf 100644 (file)
@@ -163,7 +163,7 @@ ANN static inline m_bool scan1_exp_dot(const Env env, const Exp_Dot* member) {
 
 ANN static m_bool scan1_exp_if(const Env env, const Exp_If* exp_if) {
   CHECK_BB(scan1_exp(env, exp_if->cond))
-  CHECK_BB(scan1_exp(env, exp_if->if_exp))
+  CHECK_BB(scan1_exp(env, exp_if->if_exp ?: exp_if->cond))
   return scan1_exp(env, exp_if->else_exp);
 }
 
index 9a8119c90377265fd56ec2ef25cbea3368454172..fee643818f5e42e294c2b8cc360df2a3752ead21 100644 (file)
@@ -196,7 +196,7 @@ ANN static inline m_bool scan2_exp_dot(const Env env, const Exp_Dot* member) {
 
 ANN static inline m_bool scan2_exp_if(const Env env, const Exp_If* exp_if) {
   CHECK_BB(scan2_exp(env, exp_if->cond))
-  CHECK_BB(scan2_exp(env, exp_if->if_exp))
+  CHECK_BB(scan2_exp(env, exp_if->if_exp ?: exp_if->cond))
   return scan2_exp(env, exp_if->else_exp);
 }