diff --git a/Lib/fontTools/feaLib/ast.py b/Lib/fontTools/feaLib/ast.py
index bbe6e6e74..17c6cc3fb 100644
--- a/Lib/fontTools/feaLib/ast.py
+++ b/Lib/fontTools/feaLib/ast.py
@@ -1272,15 +1272,18 @@ class MultipleSubstStatement(Statement):
replaces.append(replace)
replaces = list(zip(*replaces))
+ seen_originals = set()
for i, original in enumerate(originals):
- builder.add_multiple_subst(
- self.location,
- prefix,
- original,
- suffix,
- replaces and replaces[i] or (),
- self.forceChain,
- )
+ if original not in seen_originals:
+ seen_originals.add(original)
+ builder.add_multiple_subst(
+ self.location,
+ prefix,
+ original,
+ suffix,
+ replaces and replaces[i] or (),
+ self.forceChain,
+ )
def asFea(self, indent=""):
res = "sub "
diff --git a/Tests/feaLib/data/GSUB_2.fea b/Tests/feaLib/data/GSUB_2.fea
index 078cbec39..21db452b5 100644
--- a/Tests/feaLib/data/GSUB_2.fea
+++ b/Tests/feaLib/data/GSUB_2.fea
@@ -29,3 +29,7 @@ lookup l1 {
feature f5 {
sub @class' lookup l1 [i l];
} f5;
+
+feature f6 {
+ sub [f_i f_i]' j by [f f] [i i];
+} f6;
diff --git a/Tests/feaLib/data/GSUB_2.ttx b/Tests/feaLib/data/GSUB_2.ttx
index b2bd21bd7..fb87a0590 100644
--- a/Tests/feaLib/data/GSUB_2.ttx
+++ b/Tests/feaLib/data/GSUB_2.ttx
@@ -10,19 +10,20 @@
-
+
@@ -58,9 +59,16 @@
+
+
+
+
+
+
+
-
+
@@ -135,6 +143,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+