]> granicus.if.org Git - re2c/commitdiff
Delay '-Wcondition-order' reporting until we have necessary info.
authorUlya Trofimovich <skvadrik@gmail.com>
Thu, 27 Aug 2015 13:03:26 +0000 (14:03 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Thu, 27 Aug 2015 13:03:26 +0000 (14:03 +0100)
'-Wcondition-order' depends on 'YYSETCONDITION' calls and 'types:re2c'
directive which may occur after condition dispatch is generated.

19 files changed:
re2c/src/codegen/emit_dfa.cc
re2c/src/codegen/output.cc
re2c/src/codegen/output.h
re2c/test/condition_02.cg.c
re2c/test/condition_03.cg.c
re2c/test/condition_04.cg.c
re2c/test/condition_11.cg.c
re2c/test/condition_13.cg.c
re2c/test/condtype.cg.c
re2c/test/condtype.cs.c
re2c/test/condtype_forwdecl.cg.c [new file with mode: 0644]
re2c/test/condtype_forwdecl.cg.re [new file with mode: 0644]
re2c/test/condtype_forwdecl.cs.c [new file with mode: 0644]
re2c/test/condtype_forwdecl.cs.re [new file with mode: 0644]
re2c/test/condtype_yysetcondition.cg.c [new file with mode: 0644]
re2c/test/condtype_yysetcondition.cg.re [new file with mode: 0644]
re2c/test/condtype_yysetcondition.cs.c [new file with mode: 0644]
re2c/test/condtype_yysetcondition.cs.re [new file with mode: 0644]
re2c/test/php20150211_json_scanner.igc.c

index ef54d1626465c99e0ca27afeae96c95fb60a79be..b971fa864bafd4f6a9ef6e69409d7d10fa75d466 100644 (file)
@@ -326,10 +326,7 @@ void genCondGoto(OutputFile & o, uint32_t ind, const std::vector<std::string> &
                }
                o << indent(ind) << "}\n";
        }
-       if (o.warn_condition_order)  // see note [condition order]
-       {
-               warn.condition_order (o.get_block_line ());
-       }
+       o.insert_warn_condition_order ();
        bWroteCondCheck = true;
 }
 
index b429bf2c4ddec996fe8882358a5b51d9943560e1..91112f4f9dc25bf5193cca386ef7aaf0219af06a 100644 (file)
@@ -205,6 +205,12 @@ void OutputFile::insert_types ()
        insert_code ();
 }
 
+void OutputFile::insert_warn_condition_order ()
+{
+       blocks.back ()->fragments.push_back (new OutputFragment (OutputFragment::WARN_CONDITION_ORDER, 0));
+       insert_code ();
+}
+
 void OutputFile::insert_yyaccept_init (uint32_t ind)
 {
        blocks.back ()->fragments.push_back (new OutputFragment (OutputFragment::YYACCEPT_INIT, ind));
@@ -285,6 +291,12 @@ void OutputFile::emit
                                        case OutputFragment::TYPES:
                                                output_types (f.stream, f.indent, types);
                                                break;
+                                       case OutputFragment::WARN_CONDITION_ORDER:
+                                               if (warn_condition_order) // see note [condition order]
+                                               {
+                                                       warn.condition_order (b.line);
+                                               }
+                                               break;
                                        case OutputFragment::YYACCEPT_INIT:
                                                output_yyaccept_init (f.stream, f.indent, b.used_yyaccept);
                                                break;
index d667706b789c8b0473c26fe332a0cfa9713ba922..503a24e0aacf62ab81d443e06ced3c0a7f58df40 100644 (file)
@@ -22,6 +22,7 @@ struct OutputFragment
                , LINE_INFO
                , STATE_GOTO
                , TYPES
+               , WARN_CONDITION_ORDER
                , YYACCEPT_INIT
                , YYMAXFILL
                };
@@ -88,6 +89,7 @@ public:
        void insert_line_info ();
        void insert_state_goto (uint32_t ind);
        void insert_types ();
+       void insert_warn_condition_order ();
        void insert_yyaccept_init (uint32_t ind);
        void insert_yymaxfill ();
 
index 2babe704c78f914802bfd9e4045bfd016331ca1e..63a84c2debb5693d5cf5c7334ac8355de9aac6e7 100644 (file)
@@ -1,7 +1,7 @@
 re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string]
-re2c: warning: line 7: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 re2c: warning: line 7: naked default case in condition r1 (stray code units: [0x00-`][c-0xFF]), better add default rule * [-Wnaked-default]
 re2c: warning: line 7: naked default case in condition r2 (stray code units: [0x00-a][c-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 7: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 /* Generated by re2c */
 #line 1 "condition_02.cg.re"
 
index 4a72336f8aff44307c68ca0195534eb0a342a79c..603afd15cb059336db5e253f92495793fe955d81 100644 (file)
@@ -1,7 +1,7 @@
 re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string]
-re2c: warning: line 9: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 re2c: warning: line 9: naked default case in condition r1 (stray code units: [0x00-0][3-`][c-0xFF]), better add default rule * [-Wnaked-default]
 re2c: warning: line 9: naked default case in condition r2 (stray code units: [0x00-0][3-a][c-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 9: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 /* Generated by re2c */
 #line 1 "condition_03.cg.re"
 
index 7e40ba866d9e2deb1a25a3960ff63d04c852c099..6b70a598e4af70098e451f57f2fc12ed3385761f 100644 (file)
@@ -1,6 +1,6 @@
 re2c: warning: line 8: naked default case in condition r1 (stray code units: [0x00-0][3-`][c-0xFF]), better add default rule * [-Wnaked-default]
-re2c: warning: line 8: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 re2c: warning: line 8: naked default case in condition r2 (stray code units: [0x00-0][3-a][c-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 8: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 /* Generated by re2c */
 #line 1 "condition_04.cg.re"
 
index 94bf2b98633124ee817a35c2f22e4d58d8fbbd5c..84f4e1c87e9cb41d1b388f4cbdfb752f2034e106 100644 (file)
@@ -1,5 +1,4 @@
 re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string]
-re2c: warning: line 9: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 re2c: warning: line 9: naked default case in condition r1 (stray code units: [0x00-0][3-`][c-0xFF]), better add default rule * [-Wnaked-default]
 re2c: warning: line 9: naked default case in condition r2 (stray code units: [0x00-0][3-a][c-0xFF]), better add default rule * [-Wnaked-default]
 /* Generated by re2c */
index dc4a3e9d13fb2823e358d3ad3b443df20336ba18..f456b2265a828b0658c58bbd0026fda296077bff 100644 (file)
@@ -1,5 +1,4 @@
 re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string]
-re2c: warning: line 9: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 re2c: warning: line 9: naked default case in condition r1 (stray code units: [0x00-0][3-`][c-0xFF]), better add default rule * [-Wnaked-default]
 re2c: warning: line 9: naked default case in condition r2 (stray code units: [0x00-0][3-a][c-0xFF]), better add default rule * [-Wnaked-default]
 /* Generated by re2c */
index cd6ce5de7aec7fe45ba9c1eb70b0260f373db9bd..42cfb76cef65c393744a16674e9f9503f41b008a 100644 (file)
@@ -1,6 +1,6 @@
 re2c: warning: line 11: naked default case in condition a (stray code units: [0x00-`][b-0xFF]), better add default rule * [-Wnaked-default]
-re2c: warning: line 11: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 re2c: warning: line 11: naked default case in condition b (stray code units: [0x00-a][c-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 11: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 /* Generated by re2c */
 #line 1 "condtype.cg.re"
 int main ()
index 8aebde13bdeec6807016e4c57bac6b3f8ef88162..838aaf4bb76ebfc7cacfba01cd49277d44ab043f 100644 (file)
@@ -1,6 +1,6 @@
 re2c: warning: line 11: naked default case in condition a (stray code units: [0x00-`][b-0xFF]), better add default rule * [-Wnaked-default]
-re2c: warning: line 11: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 re2c: warning: line 11: naked default case in condition b (stray code units: [0x00-a][c-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 11: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 /* Generated by re2c */
 #line 1 "condtype.cs.re"
 int main ()
diff --git a/re2c/test/condtype_forwdecl.cg.c b/re2c/test/condtype_forwdecl.cg.c
new file mode 100644 (file)
index 0000000..8182f9e
--- /dev/null
@@ -0,0 +1,52 @@
+re2c: warning: line 14: naked default case in condition a (stray code units: [0x00-`][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 14: naked default case in condition b (stray code units: [0x00-a][c-0xFF]), better add default rule * [-Wnaked-default]
+/* Generated by re2c */
+#line 1 "condtype_forwdecl.cg.re"
+enum cond_t : int;
+
+int main ()
+{
+       cond_t cond;
+       char * YYCURSOR;
+#define YYGETCONDITION() cond
+
+#line 12 "<stdout>"
+{
+       unsigned char yych;
+       static void *yyctable[2] = {
+               &&yyc_a,
+               &&yyc_b,
+       };
+       goto *yyctable[YYGETCONDITION()];
+/* *********************************** */
+yyc_a:
+       yych = *YYCURSOR;
+       if (yych == 'a') goto yy4;
+yy4:
+       ++YYCURSOR;
+#line 12 "condtype_forwdecl.cg.re"
+       {}
+#line 28 "<stdout>"
+/* *********************************** */
+yyc_b:
+       yych = *YYCURSOR;
+       if (yych == 'b') goto yy9;
+yy9:
+       ++YYCURSOR;
+#line 13 "condtype_forwdecl.cg.re"
+       {}
+#line 37 "<stdout>"
+}
+#line 14 "condtype_forwdecl.cg.re"
+
+       return 0;
+}
+
+#line 44 "<stdout>"
+
+enum cond_t : int {
+       yyca,
+       yycb,
+};
+
+#line 18 "condtype_forwdecl.cg.re"
diff --git a/re2c/test/condtype_forwdecl.cg.re b/re2c/test/condtype_forwdecl.cg.re
new file mode 100644 (file)
index 0000000..f18a72d
--- /dev/null
@@ -0,0 +1,18 @@
+enum cond_t : int;
+
+int main ()
+{
+       cond_t cond;
+       char * YYCURSOR;
+#define YYGETCONDITION() cond
+/*!re2c
+       re2c:yyfill:enable = 0;
+       re2c:define:YYCTYPE = "unsigned char";
+       re2c:define:YYCONDTYPE = "cond_t : int";
+       <a> "a" {}
+       <b> "b" {}
+*/
+       return 0;
+}
+
+/*!types:re2c*/
diff --git a/re2c/test/condtype_forwdecl.cs.c b/re2c/test/condtype_forwdecl.cs.c
new file mode 100644 (file)
index 0000000..37a7277
--- /dev/null
@@ -0,0 +1,52 @@
+re2c: warning: line 14: naked default case in condition a (stray code units: [0x00-`][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 14: naked default case in condition b (stray code units: [0x00-a][c-0xFF]), better add default rule * [-Wnaked-default]
+/* Generated by re2c */
+#line 1 "condtype_forwdecl.cs.re"
+enum cond_t : int;
+
+int main ()
+{
+       cond_t cond;
+       char * YYCURSOR;
+#define YYGETCONDITION() cond
+
+#line 12 "<stdout>"
+{
+       unsigned char yych;
+       if (YYGETCONDITION() < 1) {
+               goto yyc_a;
+       } else {
+               goto yyc_b;
+       }
+/* *********************************** */
+yyc_a:
+       yych = *YYCURSOR;
+       if (yych == 'a') goto yy4;
+yy4:
+       ++YYCURSOR;
+#line 12 "condtype_forwdecl.cs.re"
+       {}
+#line 28 "<stdout>"
+/* *********************************** */
+yyc_b:
+       yych = *YYCURSOR;
+       if (yych == 'b') goto yy9;
+yy9:
+       ++YYCURSOR;
+#line 13 "condtype_forwdecl.cs.re"
+       {}
+#line 37 "<stdout>"
+}
+#line 14 "condtype_forwdecl.cs.re"
+
+       return 0;
+}
+
+#line 44 "<stdout>"
+
+enum cond_t : int {
+       yyca,
+       yycb,
+};
+
+#line 18 "condtype_forwdecl.cs.re"
diff --git a/re2c/test/condtype_forwdecl.cs.re b/re2c/test/condtype_forwdecl.cs.re
new file mode 100644 (file)
index 0000000..f18a72d
--- /dev/null
@@ -0,0 +1,18 @@
+enum cond_t : int;
+
+int main ()
+{
+       cond_t cond;
+       char * YYCURSOR;
+#define YYGETCONDITION() cond
+/*!re2c
+       re2c:yyfill:enable = 0;
+       re2c:define:YYCTYPE = "unsigned char";
+       re2c:define:YYCONDTYPE = "cond_t : int";
+       <a> "a" {}
+       <b> "b" {}
+*/
+       return 0;
+}
+
+/*!types:re2c*/
diff --git a/re2c/test/condtype_yysetcondition.cg.c b/re2c/test/condtype_yysetcondition.cg.c
new file mode 100644 (file)
index 0000000..66aee2f
--- /dev/null
@@ -0,0 +1,42 @@
+re2c: warning: line 11: naked default case in condition a (stray code units: [0x00-`][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 11: naked default case in condition b (stray code units: [0x00-a][c-0xFF]), better add default rule * [-Wnaked-default]
+/* Generated by re2c */
+#line 1 "condtype_yysetcondition.cg.re"
+int main ()
+{
+       YYCONDTYPE cond;
+       char * YYCURSOR;
+#define YYGETCONDITION() cond
+
+#line 10 "<stdout>"
+{
+       unsigned char yych;
+       static void *yyctable[2] = {
+               &&yyc_a,
+               &&yyc_b,
+       };
+       goto *yyctable[YYGETCONDITION()];
+/* *********************************** */
+yyc_a:
+       yych = *YYCURSOR;
+       if (yych == 'a') goto yy4;
+yy4:
+       ++YYCURSOR;
+       YYSETCONDITION(yycb);
+#line 9 "condtype_yysetcondition.cg.re"
+       {}
+#line 27 "<stdout>"
+/* *********************************** */
+yyc_b:
+       yych = *YYCURSOR;
+       if (yych == 'b') goto yy9;
+yy9:
+       ++YYCURSOR;
+#line 10 "condtype_yysetcondition.cg.re"
+       {}
+#line 36 "<stdout>"
+}
+#line 11 "condtype_yysetcondition.cg.re"
+
+       return 0;
+}
diff --git a/re2c/test/condtype_yysetcondition.cg.re b/re2c/test/condtype_yysetcondition.cg.re
new file mode 100644 (file)
index 0000000..ed9175c
--- /dev/null
@@ -0,0 +1,13 @@
+int main ()
+{
+       YYCONDTYPE cond;
+       char * YYCURSOR;
+#define YYGETCONDITION() cond
+/*!re2c
+       re2c:yyfill:enable = 0;
+       re2c:define:YYCTYPE = "unsigned char";
+       <a> "a" => b {}
+       <b> "b"      {}
+*/
+       return 0;
+}
diff --git a/re2c/test/condtype_yysetcondition.cs.c b/re2c/test/condtype_yysetcondition.cs.c
new file mode 100644 (file)
index 0000000..c41af54
--- /dev/null
@@ -0,0 +1,42 @@
+re2c: warning: line 11: naked default case in condition a (stray code units: [0x00-`][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 11: naked default case in condition b (stray code units: [0x00-a][c-0xFF]), better add default rule * [-Wnaked-default]
+/* Generated by re2c */
+#line 1 "condtype_yysetcondition.cs.re"
+int main ()
+{
+       YYCONDTYPE cond;
+       char * YYCURSOR;
+#define YYGETCONDITION() cond
+
+#line 10 "<stdout>"
+{
+       unsigned char yych;
+       if (YYGETCONDITION() < 1) {
+               goto yyc_a;
+       } else {
+               goto yyc_b;
+       }
+/* *********************************** */
+yyc_a:
+       yych = *YYCURSOR;
+       if (yych == 'a') goto yy4;
+yy4:
+       ++YYCURSOR;
+       YYSETCONDITION(yycb);
+#line 9 "condtype_yysetcondition.cs.re"
+       {}
+#line 27 "<stdout>"
+/* *********************************** */
+yyc_b:
+       yych = *YYCURSOR;
+       if (yych == 'b') goto yy9;
+yy9:
+       ++YYCURSOR;
+#line 10 "condtype_yysetcondition.cs.re"
+       {}
+#line 36 "<stdout>"
+}
+#line 11 "condtype_yysetcondition.cs.re"
+
+       return 0;
+}
diff --git a/re2c/test/condtype_yysetcondition.cs.re b/re2c/test/condtype_yysetcondition.cs.re
new file mode 100644 (file)
index 0000000..ed9175c
--- /dev/null
@@ -0,0 +1,13 @@
+int main ()
+{
+       YYCONDTYPE cond;
+       char * YYCURSOR;
+#define YYGETCONDITION() cond
+/*!re2c
+       re2c:yyfill:enable = 0;
+       re2c:define:YYCTYPE = "unsigned char";
+       <a> "a" => b {}
+       <b> "b"      {}
+*/
+       return 0;
+}
index 296bac319c7a050a9872bf4b3f80af59fb5c68e5..aa1765f47e0e350c421e86ad23508c6c21dee554 100644 (file)
@@ -1,4 +1,3 @@
-re2c: warning: line 340: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order]
 /* Generated by re2c */
 /*
   +----------------------------------------------------------------------+