]> granicus.if.org Git - re2c/commitdiff
Fixed the case of missing default label which is used only by EOF checks.
authorUlya Trofimovich <skvadrik@gmail.com>
Thu, 18 Jul 2019 16:16:04 +0000 (17:16 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Thu, 18 Jul 2019 16:16:04 +0000 (17:16 +0100)
The current fix may sometimes cause generation of unused default label, because
at the time when it's generated we haven't geerated the code for EOF checks yet
and do nt know if default label is really needed. This is what happens in the
updated test cases.

src/adfa/adfa.h
src/codegen/emit_dfa.cc
test/eof/eof_02.i.c
test/eof/eof_03.i.c

index f50ae9b7d651886d09aadc49bb9e0ce6aa7f9654..3cf7bc53d5f982c1c0ced461026adfd29433795f 100644 (file)
@@ -118,7 +118,7 @@ private:
     void findBaseState(const opt_t *opts);
     void hoist_tags(const opt_t *opts);
     void hoist_tags_and_skip(const opt_t *opts);
-    void count_used_labels(std::set<label_t> &used, label_t start, label_t initial, bool force_start, bool fFlag) const;
+    void count_used_labels(std::set<label_t> &used, label_t start, label_t initial, const opt_t *opts) const;
     void emit_body (Output &, uint32_t &, const std::set<label_t> & used_labels, label_t initial) const;
     void emit_dot(Output &o, bool last_cond) const;
 
index 85a41a2b6dda5a20719d378e9e346d62988ca066..f977dfa05ba577a3f5f401bcdafc596b1598b760 100644 (file)
@@ -56,30 +56,30 @@ void emit_eof(Output & o, uint32_t ind, const Code *code)
     o.wdelay_line_info_output();
 }
 
-void DFA::count_used_labels (std::set<label_t> & used, label_t start,
-    label_t initial, bool force_start, bool fFlag) const
+void DFA::count_used_labels(std::set<label_t> &used, label_t start
+    , label_t initial, const opt_t *opts) const
 {
     // In '-f' mode, default state is always state 0
-    if (fFlag)
-    {
-        used.insert (label_t::first ());
+    if (opts->fFlag) {
+        used.insert(label_t::first());
     }
-    if (force_start)
-    {
-        used.insert (start);
+    if (opts->startlabel_force && opts->startlabel.empty()) {
+        used.insert(start);
     }
-    for (State * s = head; s; s = s->next)
-    {
-        s->go.used_labels (used);
+    // FIXME: default label may be used by EOF checks, but they are generated
+    // later and at this point we do not know if default label is really used
+    if (defstate && opts->eof != NOEOF) {
+        used.insert(defstate->label);
     }
-    for (uint32_t i = 0; i < accepts.size (); ++i)
-    {
-        used.insert (accepts[i].first->label);
+    for (State * s = head; s; s = s->next) {
+        s->go.used_labels(used);
+    }
+    for (uint32_t i = 0; i < accepts.size(); ++i) {
+        used.insert(accepts[i].first->label);
     }
     // must go last: it needs the set of used labels
-    if (used.count (head->label))
-    {
-        used.insert (initial);
+    if (used.count(head->label)) {
+        used.insert(initial);
     }
 }
 
@@ -190,8 +190,7 @@ void DFA::emit(Output & output, uint32_t& ind, bool isLastCond, bool& bPrologBra
         s->label = output.label_counter.next ();
     }
     std::set<label_t> used_labels;
-    count_used_labels (used_labels, start_label, initial_label,
-        opts->startlabel_force && opts->startlabel.empty(), opts->fFlag);
+    count_used_labels (used_labels, start_label, initial_label, opts);
 
     head->action.set_initial(initial_label);
 
index 347a6da3f75dad05f72277d25db8a994e81a658d..22d8c26c941e22f6b7d23b1e69c2aa5f67331885 100644 (file)
@@ -72,6 +72,7 @@ yy1_:
        }
 yy2:
        ++in.cur;
+yy3:
        { return false; }
 yy4:
        ++in.cur;
index 3fe39c2f9f5d2c691fdbaeffeabbd3aae70987a3..75b2c4fc90753f011cbe4f1ee6ff34fd9a2ddb9d 100644 (file)
@@ -72,6 +72,7 @@ yy1_:
        }
 yy2:
        ++in.cur;
+yy3:
        { return false; }
 yy4:
        ++in.cur;