[subset] fix find_duplicate_features

We should check each feature against all other features with the same
tag for duplicates.
diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh
index 626abc5..513a4a6 100644
--- a/src/hb-ot-layout-gsubgpos.hh
+++ b/src/hb-ot-layout-gsubgpos.hh
@@ -3678,55 +3678,57 @@
                                 const hb_set_t *feature_indices,
                                 hb_map_t *duplicate_feature_map /* OUT */) const
   {
+    hb_set_t unique_features;
+    hb_tag_t prev_t = get_feature_tag (feature_indices->get_min ());
     //find out duplicate features after subset
-    unsigned prev = 0xFFFFu;
     for (unsigned i : feature_indices->iter ())
     {
-      if (prev == 0xFFFFu)
-      {
-        duplicate_feature_map->set (i, i);
-        prev = i;
-        continue;
-      }
-
       hb_tag_t t = get_feature_tag (i);
-      hb_tag_t prev_t = get_feature_tag (prev);
       if (t != prev_t)
       {
+        prev_t = t;
+        unique_features.clear ();
+        unique_features.add (i);
         duplicate_feature_map->set (i, i);
-        prev = i;
         continue;
       }
 
-      const Feature& f = get_feature (i);
-      const Feature& prev_f = get_feature (prev);
+      bool found = false;
 
-      auto f_iter =
-      + hb_iter (f.lookupIndex)
-      | hb_filter (lookup_indices)
-      ;
-
-      auto prev_iter =
-      + hb_iter (prev_f.lookupIndex)
-      | hb_filter (lookup_indices)
-      ;
-
-      if (f_iter.len () != prev_iter.len ())
+      for (unsigned other_f_index : unique_features.iter ())
       {
-        duplicate_feature_map->set (i, i);
-        prev = i;
-        continue;
+        const Feature& f = get_feature (i);
+        const Feature& other_f = get_feature (other_f_index);
+
+        auto f_iter =
+        + hb_iter (f.lookupIndex)
+        | hb_filter (lookup_indices)
+        ;
+  
+        auto other_f_iter =
+        + hb_iter (other_f.lookupIndex)
+        | hb_filter (lookup_indices)
+        ;
+  
+        bool is_equal = true;
+        for (; f_iter && other_f_iter; f_iter++, other_f_iter++)
+        {
+          unsigned a = *f_iter;
+          unsigned b = *other_f_iter;
+          if (a != b) { is_equal = false; break; }
+        }
+
+        if (is_equal == false || f_iter || other_f_iter) continue;
+        
+        found = true;
+        duplicate_feature_map->set (i, other_f_index);
+        break;
       }
-
-      bool is_equal = true;
-      for (auto _ : + hb_zip (f_iter, prev_iter))
-        if (_.first != _.second) { is_equal = false; break; }
-
-      if (is_equal == true) duplicate_feature_map->set (i, prev);
-      else
+      
+      if (found == false)
       {
+        unique_features.add (i);
         duplicate_feature_map->set (i, i);
-        prev = i;
       }
     }
   }
diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am
index d7b05f4..3f521fb 100644
--- a/test/subset/data/Makefile.am
+++ b/test/subset/data/Makefile.am
@@ -35,6 +35,7 @@
 	expected/layout.gdef-attachlist \
 	expected/layout.notonastaliqurdu \
 	expected/layout.tinos \
+	expected/layout.duplicate_features \
 	expected/cmap \
 	expected/cmap14 \
 	expected/sbix \
diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources
index 74b7079..ad94589 100644
--- a/test/subset/data/Makefile.sources
+++ b/test/subset/data/Makefile.sources
@@ -32,6 +32,7 @@
 	tests/layout.notonastaliqurdu.tests \
 	tests/layout.tests \
 	tests/layout.tinos.tests \
+	tests/layout.duplicate_features.tests \
 	tests/sbix.tests \
 	tests/variable.tests \
 	tests/glyph_names.tests \
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
new file mode 100644
index 0000000..d53abcb
--- /dev/null
+++ b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.retain-all-codepoint.ttf
new file mode 100644
index 0000000..4f27a6c
--- /dev/null
+++ b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.default.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
new file mode 100644
index 0000000..f3ca7d8
--- /dev/null
+++ b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.retain-all-codepoint.ttf
new file mode 100644
index 0000000..69e63ea
--- /dev/null
+++ b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.glyph-names.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
new file mode 100644
index 0000000..d53abcb
--- /dev/null
+++ b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.20,2f,38,49,4c,51,53,66,67,6f,b4,2044.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.retain-all-codepoint.ttf
new file mode 100644
index 0000000..4f27a6c
--- /dev/null
+++ b/test/subset/data/expected/layout.duplicate_features/AlegreyaSans-BlackItalic.notdef-outline.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/fonts/AlegreyaSans-BlackItalic.ttf b/test/subset/data/fonts/AlegreyaSans-BlackItalic.ttf
new file mode 100644
index 0000000..76a389d
--- /dev/null
+++ b/test/subset/data/fonts/AlegreyaSans-BlackItalic.ttf
Binary files differ
diff --git a/test/subset/data/tests/layout.duplicate_features.tests b/test/subset/data/tests/layout.duplicate_features.tests
new file mode 100644
index 0000000..d6bc9a2
--- /dev/null
+++ b/test/subset/data/tests/layout.duplicate_features.tests
@@ -0,0 +1,11 @@
+FONTS:
+AlegreyaSans-BlackItalic.ttf
+
+PROFILES:
+default.txt
+glyph-names.txt
+notdef-outline.txt
+
+SUBSETS:
+U+20,U+2f,U+38,U+49,U+4c,U+51,U+53,U+66,U+67,U+6f,U+b4,U+2044
+*
diff --git a/test/subset/meson.build b/test/subset/meson.build
index 4ed2fdd..083ab09 100644
--- a/test/subset/meson.build
+++ b/test/subset/meson.build
@@ -27,6 +27,7 @@
   'layout.gdef-attachlist',
   'layout.notonastaliqurdu',
   'layout.tinos',
+  'layout.duplicate_features',
   'cmap',
   'cmap14',
   'sbix',