From: Ulya Trofimovich Date: Thu, 27 Aug 2015 13:03:26 +0000 (+0100) Subject: Delay '-Wcondition-order' reporting until we have necessary info. X-Git-Tag: 0.15~94 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d9db9769980b384ad2af7e1f0a92c4f303240b4e;p=re2c Delay '-Wcondition-order' reporting until we have necessary info. '-Wcondition-order' depends on 'YYSETCONDITION' calls and 'types:re2c' directive which may occur after condition dispatch is generated. --- diff --git a/re2c/src/codegen/emit_dfa.cc b/re2c/src/codegen/emit_dfa.cc index ef54d162..b971fa86 100644 --- a/re2c/src/codegen/emit_dfa.cc +++ b/re2c/src/codegen/emit_dfa.cc @@ -326,10 +326,7 @@ void genCondGoto(OutputFile & o, uint32_t ind, const std::vector & } 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; } diff --git a/re2c/src/codegen/output.cc b/re2c/src/codegen/output.cc index b429bf2c..91112f4f 100644 --- a/re2c/src/codegen/output.cc +++ b/re2c/src/codegen/output.cc @@ -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; diff --git a/re2c/src/codegen/output.h b/re2c/src/codegen/output.h index d667706b..503a24e0 100644 --- a/re2c/src/codegen/output.h +++ b/re2c/src/codegen/output.h @@ -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 (); diff --git a/re2c/test/condition_02.cg.c b/re2c/test/condition_02.cg.c index 2babe704..63a84c2d 100644 --- a/re2c/test/condition_02.cg.c +++ b/re2c/test/condition_02.cg.c @@ -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" diff --git a/re2c/test/condition_03.cg.c b/re2c/test/condition_03.cg.c index 4a72336f..603afd15 100644 --- a/re2c/test/condition_03.cg.c +++ b/re2c/test/condition_03.cg.c @@ -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" diff --git a/re2c/test/condition_04.cg.c b/re2c/test/condition_04.cg.c index 7e40ba86..6b70a598 100644 --- a/re2c/test/condition_04.cg.c +++ b/re2c/test/condition_04.cg.c @@ -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" diff --git a/re2c/test/condition_11.cg.c b/re2c/test/condition_11.cg.c index 94bf2b98..84f4e1c8 100644 --- a/re2c/test/condition_11.cg.c +++ b/re2c/test/condition_11.cg.c @@ -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 */ diff --git a/re2c/test/condition_13.cg.c b/re2c/test/condition_13.cg.c index dc4a3e9d..f456b226 100644 --- a/re2c/test/condition_13.cg.c +++ b/re2c/test/condition_13.cg.c @@ -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 */ diff --git a/re2c/test/condtype.cg.c b/re2c/test/condtype.cg.c index cd6ce5de..42cfb76c 100644 --- a/re2c/test/condtype.cg.c +++ b/re2c/test/condtype.cg.c @@ -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 () diff --git a/re2c/test/condtype.cs.c b/re2c/test/condtype.cs.c index 8aebde13..838aaf4b 100644 --- a/re2c/test/condtype.cs.c +++ b/re2c/test/condtype.cs.c @@ -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 index 00000000..8182f9e9 --- /dev/null +++ b/re2c/test/condtype_forwdecl.cg.c @@ -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 "" +{ + 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 "" +/* *********************************** */ +yyc_b: + yych = *YYCURSOR; + if (yych == 'b') goto yy9; +yy9: + ++YYCURSOR; +#line 13 "condtype_forwdecl.cg.re" + {} +#line 37 "" +} +#line 14 "condtype_forwdecl.cg.re" + + return 0; +} + +#line 44 "" + +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 index 00000000..f18a72d4 --- /dev/null +++ b/re2c/test/condtype_forwdecl.cg.re @@ -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" {} + "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 index 00000000..37a72771 --- /dev/null +++ b/re2c/test/condtype_forwdecl.cs.c @@ -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 "" +{ + 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 "" +/* *********************************** */ +yyc_b: + yych = *YYCURSOR; + if (yych == 'b') goto yy9; +yy9: + ++YYCURSOR; +#line 13 "condtype_forwdecl.cs.re" + {} +#line 37 "" +} +#line 14 "condtype_forwdecl.cs.re" + + return 0; +} + +#line 44 "" + +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 index 00000000..f18a72d4 --- /dev/null +++ b/re2c/test/condtype_forwdecl.cs.re @@ -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" {} + "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 index 00000000..66aee2f9 --- /dev/null +++ b/re2c/test/condtype_yysetcondition.cg.c @@ -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 "" +{ + 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 "" +/* *********************************** */ +yyc_b: + yych = *YYCURSOR; + if (yych == 'b') goto yy9; +yy9: + ++YYCURSOR; +#line 10 "condtype_yysetcondition.cg.re" + {} +#line 36 "" +} +#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 index 00000000..ed9175c3 --- /dev/null +++ b/re2c/test/condtype_yysetcondition.cg.re @@ -0,0 +1,13 @@ +int main () +{ + YYCONDTYPE cond; + char * YYCURSOR; +#define YYGETCONDITION() cond +/*!re2c + re2c:yyfill:enable = 0; + re2c:define:YYCTYPE = "unsigned char"; + "a" => b {} + "b" {} +*/ + return 0; +} diff --git a/re2c/test/condtype_yysetcondition.cs.c b/re2c/test/condtype_yysetcondition.cs.c new file mode 100644 index 00000000..c41af549 --- /dev/null +++ b/re2c/test/condtype_yysetcondition.cs.c @@ -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 "" +{ + 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 "" +/* *********************************** */ +yyc_b: + yych = *YYCURSOR; + if (yych == 'b') goto yy9; +yy9: + ++YYCURSOR; +#line 10 "condtype_yysetcondition.cs.re" + {} +#line 36 "" +} +#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 index 00000000..ed9175c3 --- /dev/null +++ b/re2c/test/condtype_yysetcondition.cs.re @@ -0,0 +1,13 @@ +int main () +{ + YYCONDTYPE cond; + char * YYCURSOR; +#define YYGETCONDITION() cond +/*!re2c + re2c:yyfill:enable = 0; + re2c:define:YYCTYPE = "unsigned char"; + "a" => b {} + "b" {} +*/ + return 0; +} diff --git a/re2c/test/php20150211_json_scanner.igc.c b/re2c/test/php20150211_json_scanner.igc.c index 296bac31..aa1765f4 100644 --- a/re2c/test/php20150211_json_scanner.igc.c +++ b/re2c/test/php20150211_json_scanner.igc.c @@ -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 */ /* +----------------------------------------------------------------------+