Repository: fonttools/fonttools

Issue:
Output message for GPOS error 
Thanks @simoncozens for tackling the output message issue :) I just tried your last commit and run into this new output message.

Using fontmake through builder on a font which was presenting this issue last week, now output error message is:

```
Traceback (most recent call last):
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/font_project.py", line 938, in run_from_designspace
    **kwargs,
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/font_project.py", line 1014, in _run_from_designspace_interpolatable
    designspace, output_path=output_path, output_dir=output_dir, **kwargs
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/font_project.py", line 333, in build_variable_font
    inplace=True,
  File "/Users/rosalie/env/lib/python3.7/site-packages/ufo2ft/__init__.py", line 616, in compileVariableTTF
    ttfDesignSpace, exclude=excludeVariationTables, optimize=optimizeGvar
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/__init__.py", line 926, in build
    _merge_OTL(vf, model, master_fonts, axisTags)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/__init__.py", line 619, in _merge_OTL
    merger.mergeTables(font, master_fonts, ['GSUB', 'GDEF', 'GPOS'])
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 127, in mergeTables
    for m in master_ttfs])
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 1073, in mergeThings
    super(VariationMerger, self).mergeThings(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 112, in mergeThings
    self.mergeObjects(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 84, in mergeObjects
    mergerFunc(self, value, values)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 1073, in mergeThings
    super(VariationMerger, self).mergeThings(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 112, in mergeThings
    self.mergeObjects(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 84, in mergeObjects
    mergerFunc(self, value, values)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 1073, in mergeThings
    super(VariationMerger, self).mergeThings(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 112, in mergeThings
    self.mergeObjects(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 84, in mergeObjects
    mergerFunc(self, value, values)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 1073, in mergeThings
    super(VariationMerger, self).mergeThings(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 120, in mergeThings
    "got": lst},))
fontTools.varLib.errors.VarLibMergeError: <exception str() failed>

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/rosalie/env/bin/gftools-builder.py", line 83, in <module>
    builder.build()
  File "/Users/rosalie/env/lib/python3.7/site-packages/gftools/builder/__init__.py", line 145, in build
    self.build_variable()
  File "/Users/rosalie/env/lib/python3.7/site-packages/gftools/builder/__init__.py", line 246, in build_variable
    output_files = self.run_fontmake(source, args)
  File "/Users/rosalie/env/lib/python3.7/site-packages/gftools/builder/__init__.py", line 265, in run_fontmake
    FontProject().run_from_glyphs(source, **args)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/font_project.py", line 691, in run_from_glyphs
    self.run_from_designspace(designspace_path, **kwargs)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/font_project.py", line 949, in run_from_designspace
    ) from e
fontmake.errors.FontmakeError: <exception str() failed>
```

If I run only fontmake:

```
Traceback (most recent call last):
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/font_project.py", line 938, in run_from_designspace
    **kwargs,
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/font_project.py", line 1014, in _run_from_designspace_interpolatable
    designspace, output_path=output_path, output_dir=output_dir, **kwargs
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/font_project.py", line 333, in build_variable_font
    inplace=True,
  File "/Users/rosalie/env/lib/python3.7/site-packages/ufo2ft/__init__.py", line 616, in compileVariableTTF
    ttfDesignSpace, exclude=excludeVariationTables, optimize=optimizeGvar
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/__init__.py", line 926, in build
    _merge_OTL(vf, model, master_fonts, axisTags)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/__init__.py", line 619, in _merge_OTL
    merger.mergeTables(font, master_fonts, ['GSUB', 'GDEF', 'GPOS'])
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 127, in mergeTables
    for m in master_ttfs])
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 1073, in mergeThings
    super(VariationMerger, self).mergeThings(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 112, in mergeThings
    self.mergeObjects(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 84, in mergeObjects
    mergerFunc(self, value, values)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 1073, in mergeThings
    super(VariationMerger, self).mergeThings(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 112, in mergeThings
    self.mergeObjects(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 84, in mergeObjects
    mergerFunc(self, value, values)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 1073, in mergeThings
    super(VariationMerger, self).mergeThings(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 112, in mergeThings
    self.mergeObjects(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 84, in mergeObjects
    mergerFunc(self, value, values)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 1073, in mergeThings
    super(VariationMerger, self).mergeThings(out, lst)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/merger.py", line 120, in mergeThings
    "got": lst},))
fontTools.varLib.errors.VarLibMergeError: <exception str() failed>

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/__main__.py", line 445, in main
    project.run_from_glyphs(glyphs_path, **args)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/font_project.py", line 691, in run_from_glyphs
    self.run_from_designspace(designspace_path, **kwargs)
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/font_project.py", line 949, in run_from_designspace
    ) from e
fontmake.errors.FontmakeError: <exception str() failed>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/ttLib/ttFont.py", line 372, in __getitem__
    return self.tables[tag]
KeyError: 'name'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/rosalie/env/bin/fontmake", line 8, in <module>
    sys.exit(main())
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/__main__.py", line 486, in main
    sys.exit(f"fontmake: Error: {str(e)}")
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontmake/errors.py", line 33, in __str__
    cause = str(self.__cause__) if self.__cause__ is not None else None
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/errors.py", line 39, in __str__
    for ttf in self.merger.ttfs
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/varLib/errors.py", line 39, in <listcomp>
    for ttf in self.merger.ttfs
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/ttLib/ttFont.py", line 381, in __getitem__
    data = self.reader[tag]
  File "/Users/rosalie/env/lib/python3.7/site-packages/fontTools/ttLib/sfnt.py", line 105, in __getitem__
    entry = self.tables[Tag(tag)]
KeyError: 'name'
```

Same if I reinstall fontmake and https://github.com/fonttools/fonttools in a new venv


Discussion:
Thanks, I anticipated this *might* happen. I’ll need the font so will contact you separately to resolve.

Resolving patch:
diff --git a/Lib/fontTools/varLib/errors.py b/Lib/fontTools/varLib/errors.py
--- a/Lib/fontTools/varLib/errors.py
+++ b/Lib/fontTools/varLib/errors.py
@@ -1,22 +1,6 @@
-from enum import Enum, auto
 import textwrap
 
 
-class VarLibMergeFailure(Enum):
-    ShouldBeConstant = "some values were different, but should have been the same"
-    MismatchedTypes = "data had inconsistent types"
-    LengthsDiffer = "a list of objects had inconsistent lengths"
-    KeysDiffer = "a list of objects had different keys"
-    InconsistentGlyphOrder = "the glyph order was inconsistent between masters"
-    FoundANone = "one of the values in a list was empty when it shouldn't have been"
-    NotANone = "one of the values in a list was not empty when it should have been"
-    UnsupportedFormat = "an OpenType subtable (%s) had a format I didn't expect"
-    InconsistentFormat = (
-        "an OpenType subtable (%s) had inconsistent formats between masters"
-    )
-    InconsistentExtensions = "the masters use extension lookups in inconsistent ways"
-
-
 class VarLibError(Exception):
     """Base exception for the varLib module."""
 
@@ -28,47 +12,144 @@ class VarLibValidationError(VarLibError):
 class VarLibMergeError(VarLibError):
     """Raised when input data cannot be merged into a variable font."""
 
-    def __init__(self, merger, args):
+    def __init__(self, merger, **kwargs):
         self.merger = merger
-        self.args = args
-
-    def __str__(self):
-        cause, stack = self.args[0], self.args[1:]
-        fontnames = [
-            ttf["name"].getDebugName(1) + " " + ttf["name"].getDebugName(2)
-            for ttf in self.merger.ttfs
-        ]
-        context = "".join(reversed(stack))
-        details = ""
-        reason = cause["reason"].value
-        if reason == VarLibMergeFailure.FoundANone:
-            offender = [x is None for x in cause["got"]].index(True)
-            details = (
-                f"\n\nThe problem is likely to be in {fontnames[offender]}:\n"
-                f"{stack[0]}=={cause['got']}\n"
-            )
-        elif "expected" in cause and "got" in cause:
-            offender = [x == cause["expected"] for x in cause["got"]].index(False)
-            got = cause["got"][offender]
-            details = (
-                f"\n\nThe problem is likely to be in {fontnames[offender]}:\n"
-                f"Expected to see {stack[0]}=={cause['expected']}, instead saw {got}\n"
-            )
-
+        if not kwargs:
+            kwargs = {}
+        if "stack" in kwargs:
+            self.stack = kwargs["stack"]
+            del kwargs["stack"]
+        else:
+            self.stack = []
+        self.cause = kwargs
+
+    @property
+    def reason(self):
+        return self.__doc__
+
+    def _master_name(self, ix):
+        ttf = self.merger.ttfs[ix]
         if (
-            reason == VarLibMergeFailure.UnsupportedFormat
-            or reason == VarLibMergeFailure.InconsistentFormat
+            "name" in ttf
+            and ttf["name"].getDebugName(1)
+            and ttf["name"].getDebugName(2)
         ):
-            reason = reason % cause["subtable"]
+            return ttf["name"].getDebugName(1) + " " + ttf["name"].getDebugName(2)
+        elif hasattr(ttf.reader, "file") and hasattr(ttf.reader.file, "name"):
+            return ttf.reader.file.name
+        else:
+            return "master number %i" % ix
+
+    @property
+    def offender(self):
+        if "expected" in self.cause and "got" in self.cause:
+            index = [x == self.cause["expected"] for x in self.cause["got"]].index(
+                False
+            )
+            return index, self._master_name(index)
+        return None, None
+
+    @property
+    def details(self):
+        if "expected" in self.cause and "got" in self.cause:
+            offender_index, offender = self.offender
+            got = self.cause["got"][offender_index]
+            return f"Expected to see {self.stack[0]}=={self.cause['expected']}, instead saw {got}\n"
+        return ""
+
+    def __str__(self):
+        offender_index, offender = self.offender
+        location = ""
+        if offender:
+            location = f"\n\nThe problem is likely to be in {offender}:\n"
+        context = "".join(reversed(self.stack))
         basic = textwrap.fill(
-            f"Couldn't merge the fonts, because {reason}. "
+            f"Couldn't merge the fonts, because {self.reason}. "
             f"This happened while performing the following operation: {context}",
             width=78,
         )
-        return "\n\n" + basic + details
+        return "\n\n" + basic + location + self.details
+
+
+class ShouldBeConstant(VarLibMergeError):
+    """some values were different, but should have been the same"""
+
+    @property
+    def details(self):
+        if self.stack[0] != ".FeatureCount":
+            return super().details
+        offender_index, offender = self.offender
+        bad_ttf = self.merger.ttfs[offender_index]
+        good_ttf = self.merger.ttfs[offender_index - 1]
+
+        good_features = [
+            x.FeatureTag
+            for x in good_ttf[self.stack[-1]].table.FeatureList.FeatureRecord
+        ]
+        bad_features = [
+            x.FeatureTag
+            for x in bad_ttf[self.stack[-1]].table.FeatureList.FeatureRecord
+        ]
+        return (
+            "\nIncompatible features between masters.\n"
+            f"Expected: {', '.join(good_features)}.\n"
+            f"Got: {', '.join(bad_features)}.\n"
+        )
+
+
+class FoundANone(VarLibMergeError):
+    """one of the values in a list was empty when it shouldn't have been"""
+
+    @property
+    def offender(self):
+        cause = self.argv[0]
+        index = [x is None for x in cause["got"]].index(True)
+        return index, self._master_name(index)
+
+    @property
+    def details(self):
+        cause, stack = self.args[0], self.args[1:]
+        return f"{stack[0]}=={cause['got']}\n"
+
+
+class MismatchedTypes(VarLibMergeError):
+    """data had inconsistent types"""
+
+
+class LengthsDiffer(VarLibMergeError):
+    """a list of objects had inconsistent lengths"""
+
+
+class KeysDiffer(VarLibMergeError):
+    """a list of objects had different keys"""
+
+
+class InconsistentGlyphOrder(VarLibMergeError):
+    """the glyph order was inconsistent between masters"""
+
+
+class InconsistentExtensions(VarLibMergeError):
+    """the masters use extension lookups in inconsistent ways"""
+
+
+class UnsupportedFormat(VarLibMergeError):
+    """an OpenType subtable (%s) had a format I didn't expect"""
+
+    @property
+    def reason(self):
+        cause, stack = self.args[0], self.args[1:]
+        return self.__doc__ % cause["subtable"]
+
+
+class UnsupportedFormat(UnsupportedFormat):
+    """an OpenType subtable (%s) had inconsistent formats between masters"""
+
+
+class VarLibCFFMergeError(VarLibError):
+    pass
 
 
-class VarLibCFFDictMergeError(VarLibMergeError):
+class VarLibCFFDictMergeError(VarLibCFFMergeError):
     """Raised when a CFF PrivateDict cannot be merged."""
 
     def __init__(self, key, value, values):
@@ -81,7 +162,7 @@ def __init__(self, key, value, values):
         self.args = (error_msg,)
 
 
-class VarLibCFFPointTypeMergeError(VarLibMergeError):
+class VarLibCFFPointTypeMergeError(VarLibCFFMergeError):
     """Raised when a CFF glyph cannot be merged because of point type differences."""
 
     def __init__(self, point_type, pt_index, m_index, default_type, glyph_name):
@@ -93,7 +174,7 @@ def __init__(self, point_type, pt_index, m_index, default_type, glyph_name):
         self.args = (error_msg,)
 
 
-class VarLibCFFHintTypeMergeError(VarLibMergeError):
+class VarLibCFFHintTypeMergeError(VarLibCFFMergeError):
     """Raised when a CFF glyph cannot be merged because of hint type differences."""
 
     def __init__(self, hint_type, cmd_index, m_index, default_type, glyph_name):
diff --git a/Lib/fontTools/varLib/merger.py b/Lib/fontTools/varLib/merger.py
--- a/Lib/fontTools/varLib/merger.py
+++ b/Lib/fontTools/varLib/merger.py
@@ -14,8 +14,18 @@
 from functools import reduce
 from fontTools.otlLib.builder import buildSinglePos
 
-from .errors import VarLibMergeError, VarLibMergeFailure
-
+from .errors import (
+    ShouldBeConstant,
+    FoundANone,
+    MismatchedTypes,
+    LengthsDiffer,
+    KeysDiffer,
+    InconsistentGlyphOrder,
+    InconsistentExtensions,
+    UnsupportedFormat,
+    UnsupportedFormat,
+    VarLibMergeError,
+)
 
 class Merger(object):
 
@@ -69,10 +79,9 @@ def mergeObjects(self, out, lst, exclude=()):
 				item.ensureDecompiled()
 		keys = sorted(vars(out).keys())
 		if not all(keys == sorted(vars(v).keys()) for v in lst):
-			raise VarLibMergeError(self, ({
-						"reason": VarLibMergeFailure.KeysDiffer,
-						"expected": keys,
-						"got": [sorted(vars(v).keys()) for v in lst]},))
+			raise KeysDiffer(self, expected=keys,
+				got=[sorted(vars(v).keys()) for v in lst]
+			)
 		mergers = self.mergersFor(out)
 		defaultMerger = mergers.get('*', self.__class__.mergeThings)
 		try:
@@ -82,29 +91,26 @@ def mergeObjects(self, out, lst, exclude=()):
 				values = [getattr(table, key) for table in lst]
 				mergerFunc = mergers.get(key, defaultMerger)
 				mergerFunc(self, value, values)
-		except Exception as e:
-			e.args = e.args + ('.'+key,)
+		except VarLibMergeError as e:
+			e.stack.append('.'+key)
 			raise
 
 	def mergeLists(self, out, lst):
 		if not allEqualTo(out, lst, len):
-			raise VarLibMergeError(self, ({
-						"reason": VarLibMergeFailure.LengthsDiffer,
-						"expected": len(out),
-						"got": [len(x) for x in lst]},))
+			raise LengthsDiffer(self, expected=len(out), got=[len(x) for x in lst])
 		for i,(value,values) in enumerate(zip(out, zip(*lst))):
 			try:
 				self.mergeThings(value, values)
-			except Exception as e:
-				e.args = e.args + ('[%d]' % i,)
+			except VarLibMergeError as e:
+				e.stack.append('[%d]' % i)
 				raise
 
 	def mergeThings(self, out, lst):
 		if not allEqualTo(out, lst, type):
-			raise VarLibMergeError(self, ({
-					"reason": VarLibMergeFailure.MismatchedTypes,
-					"expected": type(out),
-					"got": [type(x) for x in lst]},))
+			raise MismatchedTypes(self,
+					expected=type(out).__name__,
+					got=[type(x).__name__ for x in lst]
+			)
 		mergerFunc = self.mergersFor(out).get(None, None)
 		if mergerFunc is not None:
 			mergerFunc(self, out, lst)
@@ -114,17 +120,18 @@ def mergeThings(self, out, lst):
 			self.mergeLists(out, lst)
 		else:
 			if not allEqualTo(out, lst):
-				raise VarLibMergeError(self, ({
-					"reason": VarLibMergeFailure.ShouldBeConstant,
-					"expected": out,
-					"got": lst},))
+				raise ShouldBeConstant(self, expected=out, got=lst)
 
 	def mergeTables(self, font, master_ttfs, tableTags):
-		self.ttfs = master_ttfs  # For error reporting
 		for tag in tableTags:
 			if tag not in font: continue
-			self.mergeThings(font[tag], [m[tag] if tag in m else None
-						     for m in master_ttfs])
+			try:
+				self.ttfs = [m for m in master_ttfs if tag in m]
+				self.mergeThings(font[tag], [m[tag] if tag in m else None
+							     for m in master_ttfs])
+			except VarLibMergeError as e:
+				e.stack.append(tag)
+				raise
 
 #
 # Aligning merger
@@ -136,11 +143,7 @@ class AligningMerger(Merger):
 def merge(merger, self, lst):
 	if self is None:
 		if not allNone(lst):
-			raise VarLibMergeError(self, ({
-				"reason": VarLibMergeFailure.NotANone,
-				"expected": None,
-				"got": lst
-			},))
+			raise NotANone(self, expected=None, got=lst)
 		return
 
 	lst = [l.classDefs for l in lst]
@@ -153,11 +156,7 @@ def merge(merger, self, lst):
 	for k in allKeys:
 		allValues = nonNone(l.get(k) for l in lst)
 		if not allEqual(allValues):
-			raise VarLibMergeError(self, ({
-				"reason": VarLibMergeFailure.ShouldBeConstant,
-				"expected": allValues[0],
-				"got": lst,
-			}, "."+k))
+			raise ShouldBeConstant(self, expected=allValues[0], got=lst, stack="."+k)
 		if not allValues:
 			self[k] = None
 		else:
@@ -194,9 +193,7 @@ def _merge_GlyphOrders(font, lst, values_lst=None, default=None):
 	order = sorted(combined, key=sortKey)
 	# Make sure all input glyphsets were in proper order
 	if not all(sorted(vs, key=sortKey) == vs for vs in lst):
-		raise VarLibMergeError(self, ({
-			"reason" : VarLibMergeFailure.InconsistentGlyphOrder
-		},))
+		raise InconsistentGlyphOrder(self)
 	del combined
 
 	paddedValues = None
@@ -223,10 +220,7 @@ def _Lookup_SinglePos_get_effective_value(subtables, glyph):
 		elif self.Format == 2:
 			return self.Value[self.Coverage.glyphs.index(glyph)]
 		else:
-			raise VarLibMergeError(self, ({
-				"reason": VarLibMergeFailure.UnsupportedFormat,
-				"subtable": "single positioning lookup"
-			},))
+			raise UnsupportedFormat(self, subtable="single positioning lookup")
 	return None
 
 def _Lookup_PairPos_get_effective_value_pair(subtables, firstGlyph, secondGlyph):
@@ -248,21 +242,14 @@ def _Lookup_PairPos_get_effective_value_pair(subtables, firstGlyph, secondGlyph)
 			klass2 = self.ClassDef2.classDefs.get(secondGlyph, 0)
 			return self.Class1Record[klass1].Class2Record[klass2]
 		else:
-			raise VarLibMergeError(self, ({
-				"reason": VarLibMergeFailure.UnsupportedFormat,
-				"subtable": "pair positioning lookup"
-			},))
+			raise UnsupportedFormat(self, subtable="pair positioning lookup")
 	return None
 
 @AligningMerger.merger(ot.SinglePos)
 def merge(merger, self, lst):
 	self.ValueFormat = valueFormat = reduce(int.__or__, [l.ValueFormat for l in lst], 0)
 	if not (len(lst) == 1 or (valueFormat & ~0xF == 0)):
-		raise VarLibMergeError(self, ({
-				"reason": VarLibMergeFailure.UnsupportedFormat,
-				"subtable": "single positioning lookup"
-			},))
-
+		raise UnsupportedFormat(self, subtable="single positioning lookup")
 
 	# If all have same coverage table and all are format 1,
 	coverageGlyphs = self.Coverage.glyphs
@@ -548,10 +535,7 @@ def merge(merger, self, lst):
 	elif self.Format == 2:
 		_PairPosFormat2_merge(self, lst, merger)
 	else:
-		raise VarLibMergeError(self, ({
-				"reason": VarLibMergeFailure.UnsupportedFormat,
-				"subtable": "pair positioning lookup"
-			},))
+		raise UnsupportedFormat(self, subtable="pair positioning lookup")
 
 	del merger.valueFormat1, merger.valueFormat2
 
@@ -617,8 +601,7 @@ def _MarkBasePosFormat1_merge(self, lst, merger, Mark='Mark', Base='Base'):
 		# input masters.
 
 		if not allEqual(allClasses):
-			raise VarLibMergeError(self, allClasses)
-		if not allClasses:
+			raise allClasses(self, allClasses)
 			rec = None
 		else:
 			rec = ot.MarkRecord()
@@ -667,35 +650,28 @@ def _MarkBasePosFormat1_merge(self, lst, merger, Mark='Mark', Base='Base'):
 @AligningMerger.merger(ot.MarkBasePos)
 def merge(merger, self, lst):
 	if not allEqualTo(self.Format, (l.Format for l in lst)):
-		raise VarLibMergeError(self, ({
-			"reason": VarLibMergeFailure.InconsistentFormats,
-			"subtable": "mark-to-base positioning lookup",
-			"expected": self.Format,
-			"got": [l.Format for l in lst]},))
+		raise InconsistentFormats(self,
+			subtable="mark-to-base positioning lookup",
+			expected=self.Format,
+			got=[l.Format for l in lst]
+		)
 	if self.Format == 1:
 		_MarkBasePosFormat1_merge(self, lst, merger)
 	else:
-		raise VarLibMergeError(self, ({
-			"reason": VarLibMergeFailure.UnsupportedFormat,
-			"subtable": "mark-to-base positioning lookup",
-		}))
+		raise UnsupportedFormat(self, subtable="mark-to-base positioning lookup")
 
 @AligningMerger.merger(ot.MarkMarkPos)
 def merge(merger, self, lst):
 	if not allEqualTo(self.Format, (l.Format for l in lst)):
-		raise VarLibMergeError(self, ({
-			"reason": VarLibMergeFailure.InconsistentFormats,
-			"subtable": "mark-to-mark positioning lookup",
-			"expected": self.Format,
-			"got": [l.Format for l in lst]},))
+		raise InconsistentFormats(self,
+			subtable="mark-to-mark positioning lookup",
+			expected=self.Format,
+			got=[l.Format for l in lst]
+		)
 	if self.Format == 1:
 		_MarkBasePosFormat1_merge(self, lst, merger, 'Mark1', 'Mark2')
 	else:
-		raise VarLibMergeError(self, ({
-			"reason": VarLibMergeFailure.UnsupportedFormat,
-			"subtable": "mark-to-mark positioning lookup",
-		}))
-
+		raise UnsupportedFormat(self, subtable="mark-to-mark positioning lookup")
 
 def _PairSet_flatten(lst, font):
 	self = ot.PairSet()
@@ -824,15 +800,12 @@ def merge(merger, self, lst):
 			continue
 		if sts[0].__class__.__name__.startswith('Extension'):
 			if not allEqual([st.__class__ for st in sts]):
-				raise VarLibMergeError(self, ({
-					"reason": VarLibMergeFailure.InconsistentExtensions,
-					"expected": "Extension",
-					"got": [st.__class__.__name__ for st in sts]
-				},))
+				raise InconsistentExtensions(self,
+					expected="Extension",
+					got=[st.__class__.__name__ for st in sts]
+				)
 			if not allEqual([st.ExtensionLookupType for st in sts]):
-				raise VarLibMergeError(self, ({
-					"reason": VarLibMergeFailure.InconsistentExtensions,
-				},))
+				raise InconsistentExtensions(self)
 			l.LookupType = sts[0].ExtensionLookupType
 			new_sts = [st.ExtSubTable for st in sts]
 			del sts[:]
@@ -1061,10 +1034,7 @@ def mergeThings(self, out, lst):
 		if None in lst:
 			if allNone(lst):
 				if out is not None:
-					raise VarLibMergeError(self, ({
-						"reason": VarLibMergeFailure.FoundANone,
-						"got": lst
-					},))
+					raise FoundANone(self, got=lst)
 				return
 			masterModel = self.model
 			model, lst = masterModel.getSubModel(lst)
@@ -1085,10 +1055,7 @@ def buildVarDevTable(store_builder, master_values):
 @VariationMerger.merger(ot.BaseCoord)
 def merge(merger, self, lst):
 	if self.Format != 1:
-		raise VarLibMergeError(self, ({
-			"cause": VarLibMergeFailure.UnsupportedFormat,
-			"subtable": "a baseline coordinate"
-		},))
+		raise UnsupportedFormat(self, subtable="a baseline coordinate")
 	self.Coordinate, DeviceTable = buildVarDevTable(merger.store_builder, [a.Coordinate for a in lst])
 	if DeviceTable:
 		self.Format = 3
@@ -1097,10 +1064,7 @@ def merge(merger, self, lst):
 @VariationMerger.merger(ot.CaretValue)
 def merge(merger, self, lst):
 	if self.Format != 1:
-		raise VarLibMergeError(self, ({
-			"cause": VarLibMergeFailure.UnsupportedFormat,
-			"subtable": "a caret"
-		},))
+		raise UnsupportedFormat(self, subtable="a caret")
 	self.Coordinate, DeviceTable = buildVarDevTable(merger.store_builder, [a.Coordinate for a in lst])
 	if DeviceTable:
 		self.Format = 3
@@ -1109,10 +1073,7 @@ def merge(merger, self, lst):
 @VariationMerger.merger(ot.Anchor)
 def merge(merger, self, lst):
 	if self.Format != 1:
-		raise VarLibMergeError(self, ({
-			"cause": VarLibMergeFailure.UnsupportedFormat,
-			"subtable": "an anchor"
-		},))
+		raise UnsupportedFormat(self, subtable="an anchor")
 	self.XCoordinate, XDeviceTable = buildVarDevTable(merger.store_builder, [a.XCoordinate for a in lst])
 	self.YCoordinate, YDeviceTable = buildVarDevTable(merger.store_builder, [a.YCoordinate for a in lst])
 	if XDeviceTable or YDeviceTable:


Test patch:
diff --git a/Tests/varLib/data/IncompatibleArrays.designspace b/Tests/varLib/data/IncompatibleArrays.designspace
new file mode 100644
--- /dev/null
+++ b/Tests/varLib/data/IncompatibleArrays.designspace
@@ -0,0 +1,22 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="4.1">
+  <axes>
+    <axis tag="wght" name="Weight" minimum="200" maximum="700" default="200"/>
+  </axes>
+  <sources>
+    <source filename="master_incompatible_arrays/IncompatibleArrays-Regular.ttx" name="Simple Two Axis Regular" familyname="Simple Two Axis" stylename="Regular">
+      <lib copy="1"/>
+      <groups copy="1"/>
+      <features copy="1"/>
+      <info copy="1"/>
+      <location>
+        <dimension name="Weight" xvalue="200"/>
+      </location>
+    </source>
+    <source filename="master_incompatible_arrays/IncompatibleArrays-Bold.ttx" name="Simple Two Axis Bold" familyname="Simple Two Axis" stylename="Bold">
+      <location>
+        <dimension name="Weight" xvalue="700"/>
+      </location>
+    </source>
+  </sources>
+</designspace>
diff --git a/Tests/varLib/data/IncompatibleFeatures.designspace b/Tests/varLib/data/IncompatibleFeatures.designspace
new file mode 100644
--- /dev/null
+++ b/Tests/varLib/data/IncompatibleFeatures.designspace
@@ -0,0 +1,22 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="4.1">
+  <axes>
+    <axis tag="wght" name="Weight" minimum="200" maximum="700" default="200"/>
+  </axes>
+  <sources>
+    <source filename="master_incompatible_features/IncompatibleFeatures-Regular.ttx" name="Simple Two Axis Regular" familyname="Simple Two Axis" stylename="Regular">
+      <lib copy="1"/>
+      <groups copy="1"/>
+      <features copy="1"/>
+      <info copy="1"/>
+      <location>
+        <dimension name="Weight" xvalue="200"/>
+      </location>
+    </source>
+    <source filename="master_incompatible_features/IncompatibleFeatures-Bold.ttx" name="Simple Two Axis Bold" familyname="Simple Two Axis" stylename="Bold">
+      <location>
+        <dimension name="Weight" xvalue="700"/>
+      </location>
+    </source>
+  </sources>
+</designspace>
diff --git a/Tests/varLib/data/IncompatibleLookupTypes.designspace b/Tests/varLib/data/IncompatibleLookupTypes.designspace
new file mode 100644
--- /dev/null
+++ b/Tests/varLib/data/IncompatibleLookupTypes.designspace
@@ -0,0 +1,22 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<designspace format="4.1">
+  <axes>
+    <axis tag="wght" name="Weight" minimum="200" maximum="700" default="200"/>
+  </axes>
+  <sources>
+    <source filename="master_incompatible_lookup_types/IncompatibleLookupTypes-Regular.ttx" name="Simple Two Axis Regular" familyname="Simple Two Axis" stylename="Regular">
+      <lib copy="1"/>
+      <groups copy="1"/>
+      <features copy="1"/>
+      <info copy="1"/>
+      <location>
+        <dimension name="Weight" xvalue="200"/>
+      </location>
+    </source>
+    <source filename="master_incompatible_lookup_types/IncompatibleLookupTypes-Bold.ttx" name="Simple Two Axis Bold" familyname="Simple Two Axis" stylename="Bold">
+      <location>
+        <dimension name="Weight" xvalue="700"/>
+      </location>
+    </source>
+  </sources>
+</designspace>
diff --git a/Tests/varLib/data/master_incompatible_arrays/IncompatibleArrays-Bold.ttx b/Tests/varLib/data/master_incompatible_arrays/IncompatibleArrays-Bold.ttx
new file mode 100644
--- /dev/null
+++ b/Tests/varLib/data/master_incompatible_arrays/IncompatibleArrays-Bold.ttx
@@ -0,0 +1,612 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.20">
+
+  <GlyphOrder>
+    <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+    <GlyphID id="0" name=".notdef"/>
+    <GlyphID id="1" name="A"/>
+    <GlyphID id="2" name="Aacute"/>
+    <GlyphID id="3" name="O"/>
+    <GlyphID id="4" name="V"/>
+    <GlyphID id="5" name="space"/>
+    <GlyphID id="6" name="dollar"/>
+    <GlyphID id="7" name="dollar.bold"/>
+    <GlyphID id="8" name="acutecomb"/>
+    <GlyphID id="9" name="dollar.BRACKET.500"/>
+  </GlyphOrder>
+
+  <head>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="1.0"/>
+    <fontRevision value="1.0"/>
+    <checkSumAdjustment value="0x10cb3f3"/>
+    <magicNumber value="0x5f0f3cf5"/>
+    <flags value="00000000 00000011"/>
+    <unitsPerEm value="1000"/>
+    <created value="Fri Jan 15 14:37:13 2021"/>
+    <modified value="Mon Mar 15 12:57:03 2021"/>
+    <xMin value="-141"/>
+    <yMin value="-200"/>
+    <xMax value="906"/>
+    <yMax value="949"/>
+    <macStyle value="00000000 00000001"/>
+    <lowestRecPPEM value="6"/>
+    <fontDirectionHint value="2"/>
+    <indexToLocFormat value="0"/>
+    <glyphDataFormat value="0"/>
+  </head>
+
+  <hhea>
+    <tableVersion value="0x00010000"/>
+    <ascent value="1000"/>
+    <descent value="-200"/>
+    <lineGap value="0"/>
+    <advanceWidthMax value="911"/>
+    <minLeftSideBearing value="-141"/>
+    <minRightSideBearing value="-125"/>
+    <xMaxExtent value="906"/>
+    <caretSlopeRise value="1"/>
+    <caretSlopeRun value="0"/>
+    <caretOffset value="0"/>
+    <reserved0 value="0"/>
+    <reserved1 value="0"/>
+    <reserved2 value="0"/>
+    <reserved3 value="0"/>
+    <metricDataFormat value="0"/>
+    <numberOfHMetrics value="10"/>
+  </hhea>
+
+  <maxp>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="0x10000"/>
+    <numGlyphs value="10"/>
+    <maxPoints value="52"/>
+    <maxContours value="3"/>
+    <maxCompositePoints value="16"/>
+    <maxCompositeContours value="4"/>
+    <maxZones value="1"/>
+    <maxTwilightPoints value="0"/>
+    <maxStorage value="0"/>
+    <maxFunctionDefs value="0"/>
+    <maxInstructionDefs value="0"/>
+    <maxStackElements value="0"/>
+    <maxSizeOfInstructions value="0"/>
+    <maxComponentElements value="2"/>
+    <maxComponentDepth value="1"/>
+  </maxp>
+
+  <OS_2>
+    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+         will be recalculated by the compiler -->
+    <version value="4"/>
+    <xAvgCharWidth value="672"/>
+    <usWeightClass value="400"/>
+    <usWidthClass value="5"/>
+    <fsType value="00000000 00001000"/>
+    <ySubscriptXSize value="650"/>
+    <ySubscriptYSize value="600"/>
+    <ySubscriptXOffset value="0"/>
+    <ySubscriptYOffset value="75"/>
+    <ySuperscriptXSize value="650"/>
+    <ySuperscriptYSize value="600"/>
+    <ySuperscriptXOffset value="0"/>
+    <ySuperscriptYOffset value="350"/>
+    <yStrikeoutSize value="50"/>
+    <yStrikeoutPosition value="300"/>
+    <sFamilyClass value="0"/>
+    <panose>
+      <bFamilyType value="0"/>
+      <bSerifStyle value="0"/>
+      <bWeight value="0"/>
+      <bProportion value="0"/>
+      <bContrast value="0"/>
+      <bStrokeVariation value="0"/>
+      <bArmStyle value="0"/>
+      <bLetterForm value="0"/>
+      <bMidline value="0"/>
+      <bXHeight value="0"/>
+    </panose>
+    <ulUnicodeRange1 value="00000000 00000000 00000000 01000011"/>
+    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+    <achVendID value="NONE"/>
+    <fsSelection value="00000000 00100000"/>
+    <usFirstCharIndex value="32"/>
+    <usLastCharIndex value="769"/>
+    <sTypoAscender value="800"/>
+    <sTypoDescender value="-200"/>
+    <sTypoLineGap value="200"/>
+    <usWinAscent value="1000"/>
+    <usWinDescent value="200"/>
+    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+    <sxHeight value="500"/>
+    <sCapHeight value="700"/>
+    <usDefaultChar value="0"/>
+    <usBreakChar value="32"/>
+    <usMaxContext value="2"/>
+  </OS_2>
+
+  <hmtx>
+    <mtx name=".notdef" width="500" lsb="50"/>
+    <mtx name="A" width="911" lsb="5"/>
+    <mtx name="Aacute" width="911" lsb="5"/>
+    <mtx name="O" width="715" lsb="15"/>
+    <mtx name="V" width="911" lsb="5"/>
+    <mtx name="acutecomb" width="0" lsb="-141"/>
+    <mtx name="dollar" width="600" lsb="1"/>
+    <mtx name="dollar.BRACKET.500" width="600" lsb="1"/>
+    <mtx name="dollar.bold" width="600" lsb="1"/>
+    <mtx name="space" width="300" lsb="0"/>
+  </hmtx>
+
+  <cmap>
+    <tableVersion version="0"/>
+    <cmap_format_4 platformID="0" platEncID="3" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+    <cmap_format_4 platformID="3" platEncID="1" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+  </cmap>
+
+  <loca>
+    <!-- The 'loca' table will be calculated by the compiler -->
+  </loca>
+
+  <glyf>
+
+    <!-- The xMin, yMin, xMax and yMax values
+         will be recalculated by the compiler. -->
+
+    <TTGlyph name=".notdef" xMin="50" yMin="-200" xMax="450" yMax="800">
+      <contour>
+        <pt x="50" y="-200" on="1"/>
+        <pt x="50" y="800" on="1"/>
+        <pt x="450" y="800" on="1"/>
+        <pt x="450" y="-200" on="1"/>
+      </contour>
+      <contour>
+        <pt x="100" y="-150" on="1"/>
+        <pt x="400" y="-150" on="1"/>
+        <pt x="400" y="750" on="1"/>
+        <pt x="100" y="750" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="A" xMin="5" yMin="0" xMax="906" yMax="700">
+      <contour>
+        <pt x="705" y="0" on="1"/>
+        <pt x="906" y="0" on="1"/>
+        <pt x="556" y="700" on="1"/>
+        <pt x="355" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="5" y="0" on="1"/>
+        <pt x="206" y="0" on="1"/>
+        <pt x="556" y="700" on="1"/>
+        <pt x="355" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="640" y="311" on="1"/>
+        <pt x="190" y="311" on="1"/>
+        <pt x="190" y="191" on="1"/>
+        <pt x="640" y="191" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="Aacute" xMin="5" yMin="0" xMax="906" yMax="949">
+      <component glyphName="A" x="0" y="0" flags="0x204"/>
+      <component glyphName="acutecomb" x="479" y="124" flags="0x4"/>
+    </TTGlyph>
+
+    <TTGlyph name="O" xMin="15" yMin="-10" xMax="670" yMax="710">
+      <contour>
+        <pt x="342" y="-10" on="1"/>
+        <pt x="172" y="-10" on="0"/>
+        <pt x="15" y="163" on="0"/>
+        <pt x="15" y="350" on="1"/>
+        <pt x="15" y="538" on="0"/>
+        <pt x="172" y="710" on="0"/>
+        <pt x="342" y="710" on="1"/>
+        <pt x="513" y="710" on="0"/>
+        <pt x="670" y="538" on="0"/>
+        <pt x="670" y="350" on="1"/>
+        <pt x="670" y="163" on="0"/>
+        <pt x="513" y="-10" on="0"/>
+      </contour>
+      <contour>
+        <pt x="342" y="153" on="1"/>
+        <pt x="419" y="153" on="0"/>
+        <pt x="490" y="247" on="0"/>
+        <pt x="490" y="350" on="1"/>
+        <pt x="490" y="453" on="0"/>
+        <pt x="419" y="547" on="0"/>
+        <pt x="342" y="547" on="1"/>
+        <pt x="266" y="547" on="0"/>
+        <pt x="195" y="453" on="0"/>
+        <pt x="195" y="350" on="1"/>
+        <pt x="195" y="247" on="0"/>
+        <pt x="266" y="153" on="0"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="V" xMin="5" yMin="0" xMax="906" yMax="700">
+      <contour>
+        <pt x="355" y="0" on="1"/>
+        <pt x="705" y="700" on="1"/>
+        <pt x="906" y="700" on="1"/>
+        <pt x="556" y="0" on="1"/>
+      </contour>
+      <contour>
+        <pt x="355" y="0" on="1"/>
+        <pt x="5" y="700" on="1"/>
+        <pt x="206" y="700" on="1"/>
+        <pt x="556" y="0" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="acutecomb" xMin="-141" yMin="630" xMax="125" yMax="825">
+      <contour>
+        <pt x="-118" y="756" on="1"/>
+        <pt x="-141" y="630" on="1"/>
+        <pt x="102" y="699" on="1"/>
+        <pt x="125" y="825" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar" xMin="1" yMin="-98" xMax="595" yMax="789">
+      <contour>
+        <pt x="249" y="789" on="1"/>
+        <pt x="369" y="789" on="1"/>
+        <pt x="369" y="743" on="1"/>
+        <pt x="427" y="735" on="0"/>
+        <pt x="537" y="681" on="0"/>
+        <pt x="590" y="623" on="1"/>
+        <pt x="510" y="515" on="1"/>
+        <pt x="479" y="549" on="0"/>
+        <pt x="411" y="588" on="0"/>
+        <pt x="369" y="595" on="1"/>
+        <pt x="369" y="400" on="1"/>
+        <pt x="476" y="378" on="0"/>
+        <pt x="595" y="278" on="0"/>
+        <pt x="595" y="184" on="1"/>
+        <pt x="595" y="93" on="0"/>
+        <pt x="474" y="-32" on="0"/>
+        <pt x="369" y="-46" on="1"/>
+        <pt x="369" y="-98" on="1"/>
+        <pt x="249" y="-98" on="1"/>
+        <pt x="249" y="-47" on="1"/>
+        <pt x="176" y="-39" on="0"/>
+        <pt x="52" y="17" on="0"/>
+        <pt x="1" y="69" on="1"/>
+        <pt x="80" y="179" on="1"/>
+        <pt x="118" y="144" on="0"/>
+        <pt x="195" y="106" on="0"/>
+        <pt x="249" y="100" on="1"/>
+        <pt x="249" y="273" on="1"/>
+        <pt x="246" y="274" on="1"/>
+        <pt x="144" y="294" on="0"/>
+        <pt x="28" y="405" on="0"/>
+        <pt x="28" y="502" on="1"/>
+        <pt x="28" y="567" on="0"/>
+        <pt x="84" y="667" on="0"/>
+        <pt x="184" y="732" on="0"/>
+        <pt x="249" y="742" on="1"/>
+      </contour>
+      <contour>
+        <pt x="152" y="502" on="1"/>
+        <pt x="152" y="480" on="0"/>
+        <pt x="166" y="453" on="0"/>
+        <pt x="208" y="434" on="0"/>
+        <pt x="249" y="424" on="1"/>
+        <pt x="249" y="595" on="1"/>
+        <pt x="199" y="587" on="0"/>
+        <pt x="152" y="538" on="0"/>
+      </contour>
+      <contour>
+        <pt x="369" y="100" on="1"/>
+        <pt x="426" y="107" on="0"/>
+        <pt x="471" y="150" on="0"/>
+        <pt x="471" y="183" on="1"/>
+        <pt x="471" y="201" on="0"/>
+        <pt x="456" y="225" on="0"/>
+        <pt x="412" y="243" on="0"/>
+        <pt x="369" y="252" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.BRACKET.500" xMin="1" yMin="-98" xMax="595" yMax="789">
+      <contour>
+        <pt x="249" y="789" on="1"/>
+        <pt x="369" y="789" on="1"/>
+        <pt x="369" y="743" on="1"/>
+        <pt x="427" y="735" on="0"/>
+        <pt x="537" y="681" on="0"/>
+        <pt x="590" y="623" on="1"/>
+        <pt x="510" y="515" on="1"/>
+        <pt x="468" y="560" on="0"/>
+        <pt x="374" y="600" on="0"/>
+        <pt x="308" y="600" on="1"/>
+        <pt x="227" y="600" on="0"/>
+        <pt x="152" y="548" on="0"/>
+        <pt x="152" y="502" on="1"/>
+        <pt x="152" y="479" on="0"/>
+        <pt x="168" y="450" on="0"/>
+        <pt x="217" y="431" on="0"/>
+        <pt x="264" y="421" on="1"/>
+        <pt x="363" y="401" on="1"/>
+        <pt x="473" y="379" on="0"/>
+        <pt x="595" y="279" on="0"/>
+        <pt x="595" y="184" on="1"/>
+        <pt x="595" y="93" on="0"/>
+        <pt x="474" y="-32" on="0"/>
+        <pt x="369" y="-46" on="1"/>
+        <pt x="369" y="-98" on="1"/>
+        <pt x="249" y="-98" on="1"/>
+        <pt x="249" y="-47" on="1"/>
+        <pt x="176" y="-39" on="0"/>
+        <pt x="52" y="17" on="0"/>
+        <pt x="1" y="69" on="1"/>
+        <pt x="80" y="179" on="1"/>
+        <pt x="112" y="150" on="0"/>
+        <pt x="176" y="114" on="0"/>
+        <pt x="256" y="97" on="0"/>
+        <pt x="310" y="97" on="1"/>
+        <pt x="402" y="97" on="0"/>
+        <pt x="471" y="143" on="0"/>
+        <pt x="471" y="183" on="1"/>
+        <pt x="471" y="203" on="0"/>
+        <pt x="453" y="228" on="0"/>
+        <pt x="399" y="247" on="0"/>
+        <pt x="345" y="256" on="1"/>
+        <pt x="246" y="274" on="1"/>
+        <pt x="144" y="293" on="0"/>
+        <pt x="28" y="405" on="0"/>
+        <pt x="28" y="502" on="1"/>
+        <pt x="28" y="567" on="0"/>
+        <pt x="84" y="667" on="0"/>
+        <pt x="184" y="732" on="0"/>
+        <pt x="249" y="742" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.bold" xMin="1" yMin="-98" xMax="595" yMax="789">
+      <contour>
+        <pt x="249" y="789" on="1"/>
+        <pt x="369" y="789" on="1"/>
+        <pt x="369" y="743" on="1"/>
+        <pt x="427" y="735" on="0"/>
+        <pt x="537" y="681" on="0"/>
+        <pt x="590" y="623" on="1"/>
+        <pt x="510" y="515" on="1"/>
+        <pt x="468" y="560" on="0"/>
+        <pt x="374" y="600" on="0"/>
+        <pt x="308" y="600" on="1"/>
+        <pt x="227" y="600" on="0"/>
+        <pt x="152" y="548" on="0"/>
+        <pt x="152" y="502" on="1"/>
+        <pt x="152" y="479" on="0"/>
+        <pt x="168" y="450" on="0"/>
+        <pt x="217" y="431" on="0"/>
+        <pt x="264" y="421" on="1"/>
+        <pt x="363" y="401" on="1"/>
+        <pt x="473" y="379" on="0"/>
+        <pt x="595" y="279" on="0"/>
+        <pt x="595" y="184" on="1"/>
+        <pt x="595" y="93" on="0"/>
+        <pt x="474" y="-32" on="0"/>
+        <pt x="369" y="-46" on="1"/>
+        <pt x="369" y="-98" on="1"/>
+        <pt x="249" y="-98" on="1"/>
+        <pt x="249" y="-47" on="1"/>
+        <pt x="176" y="-39" on="0"/>
+        <pt x="52" y="17" on="0"/>
+        <pt x="1" y="69" on="1"/>
+        <pt x="80" y="179" on="1"/>
+        <pt x="112" y="150" on="0"/>
+        <pt x="176" y="114" on="0"/>
+        <pt x="256" y="97" on="0"/>
+        <pt x="310" y="97" on="1"/>
+        <pt x="402" y="97" on="0"/>
+        <pt x="471" y="143" on="0"/>
+        <pt x="471" y="183" on="1"/>
+        <pt x="471" y="203" on="0"/>
+        <pt x="453" y="228" on="0"/>
+        <pt x="399" y="247" on="0"/>
+        <pt x="345" y="256" on="1"/>
+        <pt x="246" y="274" on="1"/>
+        <pt x="144" y="293" on="0"/>
+        <pt x="28" y="405" on="0"/>
+        <pt x="28" y="502" on="1"/>
+        <pt x="28" y="567" on="0"/>
+        <pt x="84" y="667" on="0"/>
+        <pt x="184" y="732" on="0"/>
+        <pt x="249" y="742" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="space"/><!-- contains no outline data -->
+
+  </glyf>
+
+  <name>
+    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis
+    </namerecord>
+    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+      Bold
+    </namerecord>
+    <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+      1.000;NONE;SimpleTwoAxis-Bold
+    </namerecord>
+    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis Bold
+    </namerecord>
+    <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+      Version 1.000
+    </namerecord>
+    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+      SimpleTwoAxis-Bold
+    </namerecord>
+  </name>
+
+  <post>
+    <formatType value="2.0"/>
+    <italicAngle value="0.0"/>
+    <underlinePosition value="-100"/>
+    <underlineThickness value="50"/>
+    <isFixedPitch value="0"/>
+    <minMemType42 value="0"/>
+    <maxMemType42 value="0"/>
+    <minMemType1 value="0"/>
+    <maxMemType1 value="0"/>
+    <psNames>
+      <!-- This file uses unique glyph names based on the information
+           found in the 'post' table. Since these names might not be unique,
+           we have to invent artificial names in case of clashes. In order to
+           be able to retain the original information, we need a name to
+           ps name mapping for those cases where they differ. That's what
+           you see below.
+            -->
+    </psNames>
+    <extraNames>
+      <!-- following are the name that are not taken from the standard Mac glyph order -->
+      <psName name="dollar.bold"/>
+      <psName name="acutecomb"/>
+      <psName name="dollar.BRACKET.500"/>
+    </extraNames>
+  </post>
+
+  <GDEF>
+    <Version value="0x00010000"/>
+    <GlyphClassDef Format="2">
+      <ClassDef glyph="A" class="1"/>
+      <ClassDef glyph="Aacute" class="1"/>
+      <ClassDef glyph="acutecomb" class="3"/>
+    </GlyphClassDef>
+  </GDEF>
+  <GPOS>
+    <Version value="0x00010000"/>
+    <ScriptList>
+    </ScriptList>
+    <FeatureList>
+      <!-- FeatureCount=2 -->
+      <FeatureRecord index="0">
+        <FeatureTag value="kern"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="0"/>
+        </Feature>
+      </FeatureRecord>
+      <FeatureRecord index="1">
+        <FeatureTag value="mark"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="1"/>
+        </Feature>
+      </FeatureRecord>
+    </FeatureList>
+    <LookupList>
+      <!-- LookupCount=2 -->
+      <Lookup index="0">
+        <LookupType value="2"/>
+        <LookupFlag value="8"/><!-- ignoreMarks -->
+        <!-- SubTableCount=1 -->
+        <PairPos index="0" Format="1">
+          <Coverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+            <Glyph value="V"/>
+          </Coverage>
+          <ValueFormat1 value="4"/>
+          <ValueFormat2 value="0"/>
+          <!-- PairSetCount=3 -->
+          <PairSet index="0">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="1">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="2">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="O"/>
+              <Value1 XAdvance="-20"/>
+            </PairValueRecord>
+          </PairSet>
+        </PairPos>
+      </Lookup>
+      <Lookup index="1">
+        <LookupType value="4"/>
+        <LookupFlag value="0"/>
+        <!-- SubTableCount=1 -->
+        <MarkBasePos index="0" Format="1">
+          <MarkCoverage Format="1">
+            <Glyph value="acutecomb"/>
+          </MarkCoverage>
+          <BaseCoverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+          </BaseCoverage>
+          <!-- ClassCount=1 -->
+          <MarkArray>
+            <!-- MarkCount=1 -->
+            <MarkRecord index="0">
+              <Class value="0"/>
+              <MarkAnchor Format="1">
+                <XCoordinate value="4"/>
+                <YCoordinate value="623"/>
+              </MarkAnchor>
+            </MarkRecord>
+          </MarkArray>
+          <BaseArray>
+            <!-- BaseCount=2 -->
+            <BaseRecord index="0">
+              <BaseAnchor index="0" Format="1">
+                <XCoordinate value="406"/>
+                <YCoordinate value="753"/>
+              </BaseAnchor>
+            </BaseRecord>
+            <BaseRecord index="1">
+              <BaseAnchor index="0" Format="1">
+                <XCoordinate value="406"/>
+                <YCoordinate value="753"/>
+              </BaseAnchor>
+            </BaseRecord>
+          </BaseArray>
+        </MarkBasePos>
+      </Lookup>
+    </LookupList>
+  </GPOS>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_incompatible_arrays/IncompatibleArrays-Regular.ttx b/Tests/varLib/data/master_incompatible_arrays/IncompatibleArrays-Regular.ttx
new file mode 100644
--- /dev/null
+++ b/Tests/varLib/data/master_incompatible_arrays/IncompatibleArrays-Regular.ttx
@@ -0,0 +1,626 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.20">
+
+  <GlyphOrder>
+    <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+    <GlyphID id="0" name=".notdef"/>
+    <GlyphID id="1" name="A"/>
+    <GlyphID id="2" name="Aacute"/>
+    <GlyphID id="3" name="O"/>
+    <GlyphID id="4" name="V"/>
+    <GlyphID id="5" name="space"/>
+    <GlyphID id="6" name="dollar"/>
+    <GlyphID id="7" name="dollar.bold"/>
+    <GlyphID id="8" name="acutecomb"/>
+    <GlyphID id="9" name="dollar.BRACKET.500"/>
+  </GlyphOrder>
+
+  <head>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="1.0"/>
+    <fontRevision value="1.0"/>
+    <checkSumAdjustment value="0x3c7bc79b"/>
+    <magicNumber value="0x5f0f3cf5"/>
+    <flags value="00000000 00000011"/>
+    <unitsPerEm value="1000"/>
+    <created value="Fri Jan 15 14:37:13 2021"/>
+    <modified value="Mon Mar 15 12:57:03 2021"/>
+    <xMin value="-141"/>
+    <yMin value="-200"/>
+    <xMax value="751"/>
+    <yMax value="915"/>
+    <macStyle value="00000000 00000000"/>
+    <lowestRecPPEM value="6"/>
+    <fontDirectionHint value="2"/>
+    <indexToLocFormat value="0"/>
+    <glyphDataFormat value="0"/>
+  </head>
+
+  <hhea>
+    <tableVersion value="0x00010000"/>
+    <ascent value="1000"/>
+    <descent value="-200"/>
+    <lineGap value="0"/>
+    <advanceWidthMax value="756"/>
+    <minLeftSideBearing value="-141"/>
+    <minRightSideBearing value="-125"/>
+    <xMaxExtent value="751"/>
+    <caretSlopeRise value="1"/>
+    <caretSlopeRun value="0"/>
+    <caretOffset value="0"/>
+    <reserved0 value="0"/>
+    <reserved1 value="0"/>
+    <reserved2 value="0"/>
+    <reserved3 value="0"/>
+    <metricDataFormat value="0"/>
+    <numberOfHMetrics value="10"/>
+  </hhea>
+
+  <maxp>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="0x10000"/>
+    <numGlyphs value="10"/>
+    <maxPoints value="52"/>
+    <maxContours value="3"/>
+    <maxCompositePoints value="16"/>
+    <maxCompositeContours value="4"/>
+    <maxZones value="1"/>
+    <maxTwilightPoints value="0"/>
+    <maxStorage value="0"/>
+    <maxFunctionDefs value="0"/>
+    <maxInstructionDefs value="0"/>
+    <maxStackElements value="0"/>
+    <maxSizeOfInstructions value="0"/>
+    <maxComponentElements value="2"/>
+    <maxComponentDepth value="1"/>
+  </maxp>
+
+  <OS_2>
+    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+         will be recalculated by the compiler -->
+    <version value="4"/>
+    <xAvgCharWidth value="604"/>
+    <usWeightClass value="400"/>
+    <usWidthClass value="5"/>
+    <fsType value="00000000 00001000"/>
+    <ySubscriptXSize value="650"/>
+    <ySubscriptYSize value="600"/>
+    <ySubscriptXOffset value="0"/>
+    <ySubscriptYOffset value="75"/>
+    <ySuperscriptXSize value="650"/>
+    <ySuperscriptYSize value="600"/>
+    <ySuperscriptXOffset value="0"/>
+    <ySuperscriptYOffset value="350"/>
+    <yStrikeoutSize value="50"/>
+    <yStrikeoutPosition value="300"/>
+    <sFamilyClass value="0"/>
+    <panose>
+      <bFamilyType value="0"/>
+      <bSerifStyle value="0"/>
+      <bWeight value="0"/>
+      <bProportion value="0"/>
+      <bContrast value="0"/>
+      <bStrokeVariation value="0"/>
+      <bArmStyle value="0"/>
+      <bLetterForm value="0"/>
+      <bMidline value="0"/>
+      <bXHeight value="0"/>
+    </panose>
+    <ulUnicodeRange1 value="00000000 00000000 00000000 01000011"/>
+    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+    <achVendID value="NONE"/>
+    <fsSelection value="00000000 01000000"/>
+    <usFirstCharIndex value="32"/>
+    <usLastCharIndex value="769"/>
+    <sTypoAscender value="800"/>
+    <sTypoDescender value="-200"/>
+    <sTypoLineGap value="200"/>
+    <usWinAscent value="1000"/>
+    <usWinDescent value="200"/>
+    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+    <sxHeight value="500"/>
+    <sCapHeight value="700"/>
+    <usDefaultChar value="0"/>
+    <usBreakChar value="32"/>
+    <usMaxContext value="2"/>
+  </OS_2>
+
+  <hmtx>
+    <mtx name=".notdef" width="500" lsb="50"/>
+    <mtx name="A" width="756" lsb="5"/>
+    <mtx name="Aacute" width="756" lsb="5"/>
+    <mtx name="O" width="664" lsb="30"/>
+    <mtx name="V" width="756" lsb="5"/>
+    <mtx name="acutecomb" width="0" lsb="-141"/>
+    <mtx name="dollar" width="600" lsb="29"/>
+    <mtx name="dollar.BRACKET.500" width="600" lsb="29"/>
+    <mtx name="dollar.bold" width="600" lsb="29"/>
+    <mtx name="space" width="200" lsb="0"/>
+  </hmtx>
+
+  <cmap>
+    <tableVersion version="0"/>
+    <cmap_format_4 platformID="0" platEncID="3" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+    <cmap_format_4 platformID="3" platEncID="1" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+  </cmap>
+
+  <loca>
+    <!-- The 'loca' table will be calculated by the compiler -->
+  </loca>
+
+  <glyf>
+
+    <!-- The xMin, yMin, xMax and yMax values
+         will be recalculated by the compiler. -->
+
+    <TTGlyph name=".notdef" xMin="50" yMin="-200" xMax="450" yMax="800">
+      <contour>
+        <pt x="50" y="-200" on="1"/>
+        <pt x="50" y="800" on="1"/>
+        <pt x="450" y="800" on="1"/>
+        <pt x="450" y="-200" on="1"/>
+      </contour>
+      <contour>
+        <pt x="100" y="-150" on="1"/>
+        <pt x="400" y="-150" on="1"/>
+        <pt x="400" y="750" on="1"/>
+        <pt x="100" y="750" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="A" xMin="5" yMin="0" xMax="751" yMax="700">
+      <contour>
+        <pt x="641" y="0" on="1"/>
+        <pt x="751" y="0" on="1"/>
+        <pt x="433" y="700" on="1"/>
+        <pt x="323" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="5" y="0" on="1"/>
+        <pt x="115" y="0" on="1"/>
+        <pt x="433" y="700" on="1"/>
+        <pt x="323" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="567" y="284" on="1"/>
+        <pt x="152" y="284" on="1"/>
+        <pt x="152" y="204" on="1"/>
+        <pt x="567" y="204" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="Aacute" xMin="5" yMin="0" xMax="751" yMax="915">
+      <component glyphName="A" x="0" y="0" flags="0x204"/>
+      <component glyphName="acutecomb" x="402" y="130" flags="0x4"/>
+    </TTGlyph>
+
+    <TTGlyph name="O" xMin="30" yMin="-10" xMax="634" yMax="710">
+      <contour>
+        <pt x="332" y="-10" on="1"/>
+        <pt x="181" y="-10" on="0"/>
+        <pt x="30" y="169" on="0"/>
+        <pt x="30" y="350" on="1"/>
+        <pt x="30" y="531" on="0"/>
+        <pt x="181" y="710" on="0"/>
+        <pt x="332" y="710" on="1"/>
+        <pt x="484" y="710" on="0"/>
+        <pt x="634" y="531" on="0"/>
+        <pt x="634" y="350" on="1"/>
+        <pt x="634" y="169" on="0"/>
+        <pt x="484" y="-10" on="0"/>
+      </contour>
+      <contour>
+        <pt x="332" y="74" on="1"/>
+        <pt x="438" y="74" on="0"/>
+        <pt x="544" y="212" on="0"/>
+        <pt x="544" y="350" on="1"/>
+        <pt x="544" y="488" on="0"/>
+        <pt x="438" y="626" on="0"/>
+        <pt x="332" y="626" on="1"/>
+        <pt x="226" y="626" on="0"/>
+        <pt x="120" y="488" on="0"/>
+        <pt x="120" y="350" on="1"/>
+        <pt x="120" y="212" on="0"/>
+        <pt x="226" y="74" on="0"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="V" xMin="5" yMin="0" xMax="751" yMax="700">
+      <contour>
+        <pt x="323" y="0" on="1"/>
+        <pt x="641" y="700" on="1"/>
+        <pt x="751" y="700" on="1"/>
+        <pt x="433" y="0" on="1"/>
+      </contour>
+      <contour>
+        <pt x="323" y="0" on="1"/>
+        <pt x="5" y="700" on="1"/>
+        <pt x="115" y="700" on="1"/>
+        <pt x="433" y="0" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="acutecomb" xMin="-141" yMin="630" xMax="125" yMax="785">
+      <contour>
+        <pt x="-118" y="716" on="1"/>
+        <pt x="-141" y="630" on="1"/>
+        <pt x="102" y="699" on="1"/>
+        <pt x="125" y="785" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar" xMin="29" yMin="-68" xMax="580" yMax="759">
+      <contour>
+        <pt x="264" y="759" on="1"/>
+        <pt x="354" y="759" on="1"/>
+        <pt x="354" y="715" on="1"/>
+        <pt x="415" y="709" on="0"/>
+        <pt x="519" y="662" on="0"/>
+        <pt x="562" y="620" on="1"/>
+        <pt x="509" y="548" on="1"/>
+        <pt x="473" y="584" on="0"/>
+        <pt x="398" y="621" on="0"/>
+        <pt x="354" y="627" on="1"/>
+        <pt x="354" y="373" on="1"/>
+        <pt x="467" y="351" on="0"/>
+        <pt x="580" y="263" on="0"/>
+        <pt x="580" y="184" on="1"/>
+        <pt x="580" y="102" on="0"/>
+        <pt x="459" y="-8" on="0"/>
+        <pt x="354" y="-18" on="1"/>
+        <pt x="354" y="-68" on="1"/>
+        <pt x="264" y="-68" on="1"/>
+        <pt x="264" y="-18" on="1"/>
+        <pt x="192" y="-12" on="0"/>
+        <pt x="72" y="34" on="0"/>
+        <pt x="29" y="74" on="1"/>
+        <pt x="81" y="146" on="1"/>
+        <pt x="123" y="110" on="0"/>
+        <pt x="207" y="73" on="0"/>
+        <pt x="264" y="69" on="1"/>
+        <pt x="264" y="301" on="1"/>
+        <pt x="249" y="304" on="1"/>
+        <pt x="148" y="323" on="0"/>
+        <pt x="43" y="420" on="0"/>
+        <pt x="43" y="502" on="1"/>
+        <pt x="43" y="559" on="0"/>
+        <pt x="99" y="650" on="0"/>
+        <pt x="199" y="707" on="0"/>
+        <pt x="264" y="715" on="1"/>
+      </contour>
+      <contour>
+        <pt x="137" y="502" on="1"/>
+        <pt x="137" y="470" on="0"/>
+        <pt x="160" y="428" on="0"/>
+        <pt x="214" y="402" on="0"/>
+        <pt x="261" y="392" on="1"/>
+        <pt x="264" y="627" on="1"/>
+        <pt x="203" y="618" on="0"/>
+        <pt x="137" y="553" on="0"/>
+      </contour>
+      <contour>
+        <pt x="354" y="69" on="1"/>
+        <pt x="423" y="76" on="0"/>
+        <pt x="486" y="135" on="0"/>
+        <pt x="486" y="183" on="1"/>
+        <pt x="486" y="211" on="0"/>
+        <pt x="462" y="250" on="0"/>
+        <pt x="405" y="275" on="0"/>
+        <pt x="354" y="285" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.BRACKET.500" xMin="29" yMin="-76" xMax="580" yMax="759">
+      <contour>
+        <pt x="264" y="759" on="1"/>
+        <pt x="354" y="759" on="1"/>
+        <pt x="354" y="715" on="1"/>
+        <pt x="415" y="709" on="0"/>
+        <pt x="519" y="662" on="0"/>
+        <pt x="562" y="620" on="1"/>
+        <pt x="509" y="548" on="1"/>
+        <pt x="464" y="592" on="0"/>
+        <pt x="370" y="630" on="0"/>
+        <pt x="308" y="630" on="1"/>
+        <pt x="226" y="630" on="0"/>
+        <pt x="137" y="562" on="0"/>
+        <pt x="137" y="502" on="1"/>
+        <pt x="137" y="470" on="0"/>
+        <pt x="160" y="428" on="0"/>
+        <pt x="214" y="402" on="0"/>
+        <pt x="261" y="392" on="1"/>
+        <pt x="360" y="372" on="1"/>
+        <pt x="469" y="350" on="0"/>
+        <pt x="580" y="263" on="0"/>
+        <pt x="580" y="184" on="1"/>
+        <pt x="580" y="102" on="0"/>
+        <pt x="459" y="-8" on="0"/>
+        <pt x="354" y="-18" on="1"/>
+        <pt x="354" y="-76" on="1"/>
+        <pt x="264" y="-76" on="1"/>
+        <pt x="264" y="-18" on="1"/>
+        <pt x="192" y="-12" on="0"/>
+        <pt x="72" y="34" on="0"/>
+        <pt x="29" y="74" on="1"/>
+        <pt x="81" y="146" on="1"/>
+        <pt x="115" y="118" on="0"/>
+        <pt x="180" y="83" on="0"/>
+        <pt x="259" y="67" on="0"/>
+        <pt x="310" y="67" on="1"/>
+        <pt x="403" y="67" on="0"/>
+        <pt x="486" y="128" on="0"/>
+        <pt x="486" y="183" on="1"/>
+        <pt x="486" y="212" on="0"/>
+        <pt x="461" y="251" on="0"/>
+        <pt x="401" y="277" on="0"/>
+        <pt x="348" y="286" on="1"/>
+        <pt x="249" y="304" on="1"/>
+        <pt x="148" y="323" on="0"/>
+        <pt x="43" y="420" on="0"/>
+        <pt x="43" y="502" on="1"/>
+        <pt x="43" y="559" on="0"/>
+        <pt x="99" y="650" on="0"/>
+        <pt x="199" y="707" on="0"/>
+        <pt x="264" y="715" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.bold" xMin="29" yMin="-76" xMax="580" yMax="759">
+      <contour>
+        <pt x="264" y="759" on="1"/>
+        <pt x="354" y="759" on="1"/>
+        <pt x="354" y="715" on="1"/>
+        <pt x="415" y="709" on="0"/>
+        <pt x="519" y="662" on="0"/>
+        <pt x="562" y="620" on="1"/>
+        <pt x="509" y="548" on="1"/>
+        <pt x="464" y="592" on="0"/>
+        <pt x="370" y="630" on="0"/>
+        <pt x="308" y="630" on="1"/>
+        <pt x="226" y="630" on="0"/>
+        <pt x="137" y="562" on="0"/>
+        <pt x="137" y="502" on="1"/>
+        <pt x="137" y="470" on="0"/>
+        <pt x="160" y="428" on="0"/>
+        <pt x="214" y="402" on="0"/>
+        <pt x="261" y="392" on="1"/>
+        <pt x="360" y="372" on="1"/>
+        <pt x="469" y="350" on="0"/>
+        <pt x="580" y="263" on="0"/>
+        <pt x="580" y="184" on="1"/>
+        <pt x="580" y="102" on="0"/>
+        <pt x="459" y="-8" on="0"/>
+        <pt x="354" y="-18" on="1"/>
+        <pt x="354" y="-76" on="1"/>
+        <pt x="264" y="-76" on="1"/>
+        <pt x="264" y="-18" on="1"/>
+        <pt x="192" y="-12" on="0"/>
+        <pt x="72" y="34" on="0"/>
+        <pt x="29" y="74" on="1"/>
+        <pt x="81" y="146" on="1"/>
+        <pt x="115" y="118" on="0"/>
+        <pt x="180" y="83" on="0"/>
+        <pt x="259" y="67" on="0"/>
+        <pt x="310" y="67" on="1"/>
+        <pt x="403" y="67" on="0"/>
+        <pt x="486" y="128" on="0"/>
+        <pt x="486" y="183" on="1"/>
+        <pt x="486" y="212" on="0"/>
+        <pt x="461" y="251" on="0"/>
+        <pt x="401" y="277" on="0"/>
+        <pt x="348" y="286" on="1"/>
+        <pt x="249" y="304" on="1"/>
+        <pt x="148" y="323" on="0"/>
+        <pt x="43" y="420" on="0"/>
+        <pt x="43" y="502" on="1"/>
+        <pt x="43" y="559" on="0"/>
+        <pt x="99" y="650" on="0"/>
+        <pt x="199" y="707" on="0"/>
+        <pt x="264" y="715" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="space"/><!-- contains no outline data -->
+
+  </glyf>
+
+  <name>
+    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis
+    </namerecord>
+    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+      Regular
+    </namerecord>
+    <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+      1.000;NONE;SimpleTwoAxis-Regular
+    </namerecord>
+    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis Regular
+    </namerecord>
+    <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+      Version 1.000
+    </namerecord>
+    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+      SimpleTwoAxis-Regular
+    </namerecord>
+  </name>
+
+  <post>
+    <formatType value="2.0"/>
+    <italicAngle value="0.0"/>
+    <underlinePosition value="-100"/>
+    <underlineThickness value="50"/>
+    <isFixedPitch value="0"/>
+    <minMemType42 value="0"/>
+    <maxMemType42 value="0"/>
+    <minMemType1 value="0"/>
+    <maxMemType1 value="0"/>
+    <psNames>
+      <!-- This file uses unique glyph names based on the information
+           found in the 'post' table. Since these names might not be unique,
+           we have to invent artificial names in case of clashes. In order to
+           be able to retain the original information, we need a name to
+           ps name mapping for those cases where they differ. That's what
+           you see below.
+            -->
+    </psNames>
+    <extraNames>
+      <!-- following are the name that are not taken from the standard Mac glyph order -->
+      <psName name="dollar.bold"/>
+      <psName name="acutecomb"/>
+      <psName name="dollar.BRACKET.500"/>
+    </extraNames>
+  </post>
+
+  <GDEF>
+    <Version value="0x00010000"/>
+    <GlyphClassDef Format="2">
+      <ClassDef glyph="A" class="1"/>
+      <ClassDef glyph="Aacute" class="1"/>
+      <ClassDef glyph="acutecomb" class="3"/>
+    </GlyphClassDef>
+  </GDEF>
+
+  <GPOS>
+    <Version value="0x00010000"/>
+    <ScriptList>
+      <!-- ScriptCount=1 -->
+      <ScriptRecord index="0">
+        <ScriptTag value="DFLT"/>
+        <Script>
+          <DefaultLangSys>
+            <ReqFeatureIndex value="65535"/>
+            <!-- FeatureCount=2 -->
+            <FeatureIndex index="0" value="0"/>
+            <FeatureIndex index="1" value="1"/>
+          </DefaultLangSys>
+          <!-- LangSysCount=0 -->
+        </Script>
+      </ScriptRecord>
+    </ScriptList>
+    <FeatureList>
+      <!-- FeatureCount=2 -->
+      <FeatureRecord index="0">
+        <FeatureTag value="kern"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="0"/>
+        </Feature>
+      </FeatureRecord>
+      <FeatureRecord index="1">
+        <FeatureTag value="mark"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="1"/>
+        </Feature>
+      </FeatureRecord>
+    </FeatureList>
+    <LookupList>
+      <!-- LookupCount=2 -->
+      <Lookup index="0">
+        <LookupType value="2"/>
+        <LookupFlag value="8"/><!-- ignoreMarks -->
+        <!-- SubTableCount=1 -->
+        <PairPos index="0" Format="1">
+          <Coverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+            <Glyph value="V"/>
+          </Coverage>
+          <ValueFormat1 value="4"/>
+          <ValueFormat2 value="0"/>
+          <!-- PairSetCount=3 -->
+          <PairSet index="0">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="1">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="2">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="O"/>
+              <Value1 XAdvance="-20"/>
+            </PairValueRecord>
+          </PairSet>
+        </PairPos>
+      </Lookup>
+      <Lookup index="1">
+        <LookupType value="4"/>
+        <LookupFlag value="0"/>
+        <!-- SubTableCount=1 -->
+        <MarkBasePos index="0" Format="1">
+          <MarkCoverage Format="1">
+            <Glyph value="acutecomb"/>
+          </MarkCoverage>
+          <BaseCoverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+          </BaseCoverage>
+          <!-- ClassCount=1 -->
+          <MarkArray>
+            <!-- MarkCount=1 -->
+            <MarkRecord index="0">
+              <Class value="0"/>
+              <MarkAnchor Format="1">
+                <XCoordinate value="4"/>
+                <YCoordinate value="623"/>
+              </MarkAnchor>
+            </MarkRecord>
+          </MarkArray>
+          <BaseArray>
+            <!-- BaseCount=2 -->
+            <BaseRecord index="0">
+              <BaseAnchor index="0" Format="1">
+                <XCoordinate value="406"/>
+                <YCoordinate value="753"/>
+              </BaseAnchor>
+            </BaseRecord>
+            <BaseRecord index="1">
+              <BaseAnchor index="0" Format="1">
+                <XCoordinate value="406"/>
+                <YCoordinate value="753"/>
+              </BaseAnchor>
+            </BaseRecord>
+          </BaseArray>
+        </MarkBasePos>
+      </Lookup>
+    </LookupList>
+  </GPOS>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_incompatible_features/IncompatibleFeatures-Bold.ttx b/Tests/varLib/data/master_incompatible_features/IncompatibleFeatures-Bold.ttx
new file mode 100644
--- /dev/null
+++ b/Tests/varLib/data/master_incompatible_features/IncompatibleFeatures-Bold.ttx
@@ -0,0 +1,578 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.20">
+
+  <GlyphOrder>
+    <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+    <GlyphID id="0" name=".notdef"/>
+    <GlyphID id="1" name="A"/>
+    <GlyphID id="2" name="Aacute"/>
+    <GlyphID id="3" name="O"/>
+    <GlyphID id="4" name="V"/>
+    <GlyphID id="5" name="space"/>
+    <GlyphID id="6" name="dollar"/>
+    <GlyphID id="7" name="dollar.bold"/>
+    <GlyphID id="8" name="acutecomb"/>
+    <GlyphID id="9" name="dollar.BRACKET.500"/>
+  </GlyphOrder>
+
+  <head>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="1.0"/>
+    <fontRevision value="1.0"/>
+    <checkSumAdjustment value="0x10cb3f3"/>
+    <magicNumber value="0x5f0f3cf5"/>
+    <flags value="00000000 00000011"/>
+    <unitsPerEm value="1000"/>
+    <created value="Fri Jan 15 14:37:13 2021"/>
+    <modified value="Mon Mar 15 12:57:03 2021"/>
+    <xMin value="-141"/>
+    <yMin value="-200"/>
+    <xMax value="906"/>
+    <yMax value="949"/>
+    <macStyle value="00000000 00000001"/>
+    <lowestRecPPEM value="6"/>
+    <fontDirectionHint value="2"/>
+    <indexToLocFormat value="0"/>
+    <glyphDataFormat value="0"/>
+  </head>
+
+  <hhea>
+    <tableVersion value="0x00010000"/>
+    <ascent value="1000"/>
+    <descent value="-200"/>
+    <lineGap value="0"/>
+    <advanceWidthMax value="911"/>
+    <minLeftSideBearing value="-141"/>
+    <minRightSideBearing value="-125"/>
+    <xMaxExtent value="906"/>
+    <caretSlopeRise value="1"/>
+    <caretSlopeRun value="0"/>
+    <caretOffset value="0"/>
+    <reserved0 value="0"/>
+    <reserved1 value="0"/>
+    <reserved2 value="0"/>
+    <reserved3 value="0"/>
+    <metricDataFormat value="0"/>
+    <numberOfHMetrics value="10"/>
+  </hhea>
+
+  <maxp>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="0x10000"/>
+    <numGlyphs value="10"/>
+    <maxPoints value="52"/>
+    <maxContours value="3"/>
+    <maxCompositePoints value="16"/>
+    <maxCompositeContours value="4"/>
+    <maxZones value="1"/>
+    <maxTwilightPoints value="0"/>
+    <maxStorage value="0"/>
+    <maxFunctionDefs value="0"/>
+    <maxInstructionDefs value="0"/>
+    <maxStackElements value="0"/>
+    <maxSizeOfInstructions value="0"/>
+    <maxComponentElements value="2"/>
+    <maxComponentDepth value="1"/>
+  </maxp>
+
+  <OS_2>
+    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+         will be recalculated by the compiler -->
+    <version value="4"/>
+    <xAvgCharWidth value="672"/>
+    <usWeightClass value="400"/>
+    <usWidthClass value="5"/>
+    <fsType value="00000000 00001000"/>
+    <ySubscriptXSize value="650"/>
+    <ySubscriptYSize value="600"/>
+    <ySubscriptXOffset value="0"/>
+    <ySubscriptYOffset value="75"/>
+    <ySuperscriptXSize value="650"/>
+    <ySuperscriptYSize value="600"/>
+    <ySuperscriptXOffset value="0"/>
+    <ySuperscriptYOffset value="350"/>
+    <yStrikeoutSize value="50"/>
+    <yStrikeoutPosition value="300"/>
+    <sFamilyClass value="0"/>
+    <panose>
+      <bFamilyType value="0"/>
+      <bSerifStyle value="0"/>
+      <bWeight value="0"/>
+      <bProportion value="0"/>
+      <bContrast value="0"/>
+      <bStrokeVariation value="0"/>
+      <bArmStyle value="0"/>
+      <bLetterForm value="0"/>
+      <bMidline value="0"/>
+      <bXHeight value="0"/>
+    </panose>
+    <ulUnicodeRange1 value="00000000 00000000 00000000 01000011"/>
+    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+    <achVendID value="NONE"/>
+    <fsSelection value="00000000 00100000"/>
+    <usFirstCharIndex value="32"/>
+    <usLastCharIndex value="769"/>
+    <sTypoAscender value="800"/>
+    <sTypoDescender value="-200"/>
+    <sTypoLineGap value="200"/>
+    <usWinAscent value="1000"/>
+    <usWinDescent value="200"/>
+    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+    <sxHeight value="500"/>
+    <sCapHeight value="700"/>
+    <usDefaultChar value="0"/>
+    <usBreakChar value="32"/>
+    <usMaxContext value="2"/>
+  </OS_2>
+
+  <hmtx>
+    <mtx name=".notdef" width="500" lsb="50"/>
+    <mtx name="A" width="911" lsb="5"/>
+    <mtx name="Aacute" width="911" lsb="5"/>
+    <mtx name="O" width="715" lsb="15"/>
+    <mtx name="V" width="911" lsb="5"/>
+    <mtx name="acutecomb" width="0" lsb="-141"/>
+    <mtx name="dollar" width="600" lsb="1"/>
+    <mtx name="dollar.BRACKET.500" width="600" lsb="1"/>
+    <mtx name="dollar.bold" width="600" lsb="1"/>
+    <mtx name="space" width="300" lsb="0"/>
+  </hmtx>
+
+  <cmap>
+    <tableVersion version="0"/>
+    <cmap_format_4 platformID="0" platEncID="3" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+    <cmap_format_4 platformID="3" platEncID="1" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+  </cmap>
+
+  <loca>
+    <!-- The 'loca' table will be calculated by the compiler -->
+  </loca>
+
+  <glyf>
+
+    <!-- The xMin, yMin, xMax and yMax values
+         will be recalculated by the compiler. -->
+
+    <TTGlyph name=".notdef" xMin="50" yMin="-200" xMax="450" yMax="800">
+      <contour>
+        <pt x="50" y="-200" on="1"/>
+        <pt x="50" y="800" on="1"/>
+        <pt x="450" y="800" on="1"/>
+        <pt x="450" y="-200" on="1"/>
+      </contour>
+      <contour>
+        <pt x="100" y="-150" on="1"/>
+        <pt x="400" y="-150" on="1"/>
+        <pt x="400" y="750" on="1"/>
+        <pt x="100" y="750" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="A" xMin="5" yMin="0" xMax="906" yMax="700">
+      <contour>
+        <pt x="705" y="0" on="1"/>
+        <pt x="906" y="0" on="1"/>
+        <pt x="556" y="700" on="1"/>
+        <pt x="355" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="5" y="0" on="1"/>
+        <pt x="206" y="0" on="1"/>
+        <pt x="556" y="700" on="1"/>
+        <pt x="355" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="640" y="311" on="1"/>
+        <pt x="190" y="311" on="1"/>
+        <pt x="190" y="191" on="1"/>
+        <pt x="640" y="191" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="Aacute" xMin="5" yMin="0" xMax="906" yMax="949">
+      <component glyphName="A" x="0" y="0" flags="0x204"/>
+      <component glyphName="acutecomb" x="479" y="124" flags="0x4"/>
+    </TTGlyph>
+
+    <TTGlyph name="O" xMin="15" yMin="-10" xMax="670" yMax="710">
+      <contour>
+        <pt x="342" y="-10" on="1"/>
+        <pt x="172" y="-10" on="0"/>
+        <pt x="15" y="163" on="0"/>
+        <pt x="15" y="350" on="1"/>
+        <pt x="15" y="538" on="0"/>
+        <pt x="172" y="710" on="0"/>
+        <pt x="342" y="710" on="1"/>
+        <pt x="513" y="710" on="0"/>
+        <pt x="670" y="538" on="0"/>
+        <pt x="670" y="350" on="1"/>
+        <pt x="670" y="163" on="0"/>
+        <pt x="513" y="-10" on="0"/>
+      </contour>
+      <contour>
+        <pt x="342" y="153" on="1"/>
+        <pt x="419" y="153" on="0"/>
+        <pt x="490" y="247" on="0"/>
+        <pt x="490" y="350" on="1"/>
+        <pt x="490" y="453" on="0"/>
+        <pt x="419" y="547" on="0"/>
+        <pt x="342" y="547" on="1"/>
+        <pt x="266" y="547" on="0"/>
+        <pt x="195" y="453" on="0"/>
+        <pt x="195" y="350" on="1"/>
+        <pt x="195" y="247" on="0"/>
+        <pt x="266" y="153" on="0"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="V" xMin="5" yMin="0" xMax="906" yMax="700">
+      <contour>
+        <pt x="355" y="0" on="1"/>
+        <pt x="705" y="700" on="1"/>
+        <pt x="906" y="700" on="1"/>
+        <pt x="556" y="0" on="1"/>
+      </contour>
+      <contour>
+        <pt x="355" y="0" on="1"/>
+        <pt x="5" y="700" on="1"/>
+        <pt x="206" y="700" on="1"/>
+        <pt x="556" y="0" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="acutecomb" xMin="-141" yMin="630" xMax="125" yMax="825">
+      <contour>
+        <pt x="-118" y="756" on="1"/>
+        <pt x="-141" y="630" on="1"/>
+        <pt x="102" y="699" on="1"/>
+        <pt x="125" y="825" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar" xMin="1" yMin="-98" xMax="595" yMax="789">
+      <contour>
+        <pt x="249" y="789" on="1"/>
+        <pt x="369" y="789" on="1"/>
+        <pt x="369" y="743" on="1"/>
+        <pt x="427" y="735" on="0"/>
+        <pt x="537" y="681" on="0"/>
+        <pt x="590" y="623" on="1"/>
+        <pt x="510" y="515" on="1"/>
+        <pt x="479" y="549" on="0"/>
+        <pt x="411" y="588" on="0"/>
+        <pt x="369" y="595" on="1"/>
+        <pt x="369" y="400" on="1"/>
+        <pt x="476" y="378" on="0"/>
+        <pt x="595" y="278" on="0"/>
+        <pt x="595" y="184" on="1"/>
+        <pt x="595" y="93" on="0"/>
+        <pt x="474" y="-32" on="0"/>
+        <pt x="369" y="-46" on="1"/>
+        <pt x="369" y="-98" on="1"/>
+        <pt x="249" y="-98" on="1"/>
+        <pt x="249" y="-47" on="1"/>
+        <pt x="176" y="-39" on="0"/>
+        <pt x="52" y="17" on="0"/>
+        <pt x="1" y="69" on="1"/>
+        <pt x="80" y="179" on="1"/>
+        <pt x="118" y="144" on="0"/>
+        <pt x="195" y="106" on="0"/>
+        <pt x="249" y="100" on="1"/>
+        <pt x="249" y="273" on="1"/>
+        <pt x="246" y="274" on="1"/>
+        <pt x="144" y="294" on="0"/>
+        <pt x="28" y="405" on="0"/>
+        <pt x="28" y="502" on="1"/>
+        <pt x="28" y="567" on="0"/>
+        <pt x="84" y="667" on="0"/>
+        <pt x="184" y="732" on="0"/>
+        <pt x="249" y="742" on="1"/>
+      </contour>
+      <contour>
+        <pt x="152" y="502" on="1"/>
+        <pt x="152" y="480" on="0"/>
+        <pt x="166" y="453" on="0"/>
+        <pt x="208" y="434" on="0"/>
+        <pt x="249" y="424" on="1"/>
+        <pt x="249" y="595" on="1"/>
+        <pt x="199" y="587" on="0"/>
+        <pt x="152" y="538" on="0"/>
+      </contour>
+      <contour>
+        <pt x="369" y="100" on="1"/>
+        <pt x="426" y="107" on="0"/>
+        <pt x="471" y="150" on="0"/>
+        <pt x="471" y="183" on="1"/>
+        <pt x="471" y="201" on="0"/>
+        <pt x="456" y="225" on="0"/>
+        <pt x="412" y="243" on="0"/>
+        <pt x="369" y="252" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.BRACKET.500" xMin="1" yMin="-98" xMax="595" yMax="789">
+      <contour>
+        <pt x="249" y="789" on="1"/>
+        <pt x="369" y="789" on="1"/>
+        <pt x="369" y="743" on="1"/>
+        <pt x="427" y="735" on="0"/>
+        <pt x="537" y="681" on="0"/>
+        <pt x="590" y="623" on="1"/>
+        <pt x="510" y="515" on="1"/>
+        <pt x="468" y="560" on="0"/>
+        <pt x="374" y="600" on="0"/>
+        <pt x="308" y="600" on="1"/>
+        <pt x="227" y="600" on="0"/>
+        <pt x="152" y="548" on="0"/>
+        <pt x="152" y="502" on="1"/>
+        <pt x="152" y="479" on="0"/>
+        <pt x="168" y="450" on="0"/>
+        <pt x="217" y="431" on="0"/>
+        <pt x="264" y="421" on="1"/>
+        <pt x="363" y="401" on="1"/>
+        <pt x="473" y="379" on="0"/>
+        <pt x="595" y="279" on="0"/>
+        <pt x="595" y="184" on="1"/>
+        <pt x="595" y="93" on="0"/>
+        <pt x="474" y="-32" on="0"/>
+        <pt x="369" y="-46" on="1"/>
+        <pt x="369" y="-98" on="1"/>
+        <pt x="249" y="-98" on="1"/>
+        <pt x="249" y="-47" on="1"/>
+        <pt x="176" y="-39" on="0"/>
+        <pt x="52" y="17" on="0"/>
+        <pt x="1" y="69" on="1"/>
+        <pt x="80" y="179" on="1"/>
+        <pt x="112" y="150" on="0"/>
+        <pt x="176" y="114" on="0"/>
+        <pt x="256" y="97" on="0"/>
+        <pt x="310" y="97" on="1"/>
+        <pt x="402" y="97" on="0"/>
+        <pt x="471" y="143" on="0"/>
+        <pt x="471" y="183" on="1"/>
+        <pt x="471" y="203" on="0"/>
+        <pt x="453" y="228" on="0"/>
+        <pt x="399" y="247" on="0"/>
+        <pt x="345" y="256" on="1"/>
+        <pt x="246" y="274" on="1"/>
+        <pt x="144" y="293" on="0"/>
+        <pt x="28" y="405" on="0"/>
+        <pt x="28" y="502" on="1"/>
+        <pt x="28" y="567" on="0"/>
+        <pt x="84" y="667" on="0"/>
+        <pt x="184" y="732" on="0"/>
+        <pt x="249" y="742" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.bold" xMin="1" yMin="-98" xMax="595" yMax="789">
+      <contour>
+        <pt x="249" y="789" on="1"/>
+        <pt x="369" y="789" on="1"/>
+        <pt x="369" y="743" on="1"/>
+        <pt x="427" y="735" on="0"/>
+        <pt x="537" y="681" on="0"/>
+        <pt x="590" y="623" on="1"/>
+        <pt x="510" y="515" on="1"/>
+        <pt x="468" y="560" on="0"/>
+        <pt x="374" y="600" on="0"/>
+        <pt x="308" y="600" on="1"/>
+        <pt x="227" y="600" on="0"/>
+        <pt x="152" y="548" on="0"/>
+        <pt x="152" y="502" on="1"/>
+        <pt x="152" y="479" on="0"/>
+        <pt x="168" y="450" on="0"/>
+        <pt x="217" y="431" on="0"/>
+        <pt x="264" y="421" on="1"/>
+        <pt x="363" y="401" on="1"/>
+        <pt x="473" y="379" on="0"/>
+        <pt x="595" y="279" on="0"/>
+        <pt x="595" y="184" on="1"/>
+        <pt x="595" y="93" on="0"/>
+        <pt x="474" y="-32" on="0"/>
+        <pt x="369" y="-46" on="1"/>
+        <pt x="369" y="-98" on="1"/>
+        <pt x="249" y="-98" on="1"/>
+        <pt x="249" y="-47" on="1"/>
+        <pt x="176" y="-39" on="0"/>
+        <pt x="52" y="17" on="0"/>
+        <pt x="1" y="69" on="1"/>
+        <pt x="80" y="179" on="1"/>
+        <pt x="112" y="150" on="0"/>
+        <pt x="176" y="114" on="0"/>
+        <pt x="256" y="97" on="0"/>
+        <pt x="310" y="97" on="1"/>
+        <pt x="402" y="97" on="0"/>
+        <pt x="471" y="143" on="0"/>
+        <pt x="471" y="183" on="1"/>
+        <pt x="471" y="203" on="0"/>
+        <pt x="453" y="228" on="0"/>
+        <pt x="399" y="247" on="0"/>
+        <pt x="345" y="256" on="1"/>
+        <pt x="246" y="274" on="1"/>
+        <pt x="144" y="293" on="0"/>
+        <pt x="28" y="405" on="0"/>
+        <pt x="28" y="502" on="1"/>
+        <pt x="28" y="567" on="0"/>
+        <pt x="84" y="667" on="0"/>
+        <pt x="184" y="732" on="0"/>
+        <pt x="249" y="742" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="space"/><!-- contains no outline data -->
+
+  </glyf>
+
+  <name>
+    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis
+    </namerecord>
+    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+      Bold
+    </namerecord>
+    <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+      1.000;NONE;SimpleTwoAxis-Bold
+    </namerecord>
+    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis Bold
+    </namerecord>
+    <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+      Version 1.000
+    </namerecord>
+    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+      SimpleTwoAxis-Bold
+    </namerecord>
+  </name>
+
+  <post>
+    <formatType value="2.0"/>
+    <italicAngle value="0.0"/>
+    <underlinePosition value="-100"/>
+    <underlineThickness value="50"/>
+    <isFixedPitch value="0"/>
+    <minMemType42 value="0"/>
+    <maxMemType42 value="0"/>
+    <minMemType1 value="0"/>
+    <maxMemType1 value="0"/>
+    <psNames>
+      <!-- This file uses unique glyph names based on the information
+           found in the 'post' table. Since these names might not be unique,
+           we have to invent artificial names in case of clashes. In order to
+           be able to retain the original information, we need a name to
+           ps name mapping for those cases where they differ. That's what
+           you see below.
+            -->
+    </psNames>
+    <extraNames>
+      <!-- following are the name that are not taken from the standard Mac glyph order -->
+      <psName name="dollar.bold"/>
+      <psName name="acutecomb"/>
+      <psName name="dollar.BRACKET.500"/>
+    </extraNames>
+  </post>
+
+  <GDEF>
+    <Version value="0x00010000"/>
+    <GlyphClassDef Format="2">
+      <ClassDef glyph="A" class="1"/>
+      <ClassDef glyph="Aacute" class="1"/>
+      <ClassDef glyph="acutecomb" class="3"/>
+    </GlyphClassDef>
+  </GDEF>
+
+  <GPOS>
+    <Version value="0x00010000"/>
+    <ScriptList>
+      <!-- ScriptCount=1 -->
+      <ScriptRecord index="0">
+        <ScriptTag value="DFLT"/>
+        <Script>
+          <DefaultLangSys>
+            <ReqFeatureIndex value="65535"/>
+            <!-- FeatureCount=2 -->
+            <FeatureIndex index="0" value="0"/>
+          </DefaultLangSys>
+          <!-- LangSysCount=0 -->
+        </Script>
+      </ScriptRecord>
+    </ScriptList>
+    <FeatureList>
+      <!-- FeatureCount=2 -->
+      <FeatureRecord index="0">
+        <FeatureTag value="kern"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="0"/>
+        </Feature>
+      </FeatureRecord>
+    </FeatureList>
+    <LookupList>
+      <!-- LookupCount=2 -->
+      <Lookup index="0">
+        <LookupType value="2"/>
+        <LookupFlag value="8"/><!-- ignoreMarks -->
+        <!-- SubTableCount=1 -->
+        <PairPos index="0" Format="1">
+          <Coverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+            <Glyph value="V"/>
+          </Coverage>
+          <ValueFormat1 value="4"/>
+          <ValueFormat2 value="0"/>
+          <!-- PairSetCount=3 -->
+          <PairSet index="0">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-120"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="1">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-120"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="2">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="O"/>
+              <Value1 XAdvance="-20"/>
+            </PairValueRecord>
+          </PairSet>
+        </PairPos>
+      </Lookup>
+    </LookupList>
+  </GPOS>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_incompatible_features/IncompatibleFeatures-Regular.ttx b/Tests/varLib/data/master_incompatible_features/IncompatibleFeatures-Regular.ttx
new file mode 100644
--- /dev/null
+++ b/Tests/varLib/data/master_incompatible_features/IncompatibleFeatures-Regular.ttx
@@ -0,0 +1,626 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.20">
+
+  <GlyphOrder>
+    <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+    <GlyphID id="0" name=".notdef"/>
+    <GlyphID id="1" name="A"/>
+    <GlyphID id="2" name="Aacute"/>
+    <GlyphID id="3" name="O"/>
+    <GlyphID id="4" name="V"/>
+    <GlyphID id="5" name="space"/>
+    <GlyphID id="6" name="dollar"/>
+    <GlyphID id="7" name="dollar.bold"/>
+    <GlyphID id="8" name="acutecomb"/>
+    <GlyphID id="9" name="dollar.BRACKET.500"/>
+  </GlyphOrder>
+
+  <head>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="1.0"/>
+    <fontRevision value="1.0"/>
+    <checkSumAdjustment value="0x3c7bc79b"/>
+    <magicNumber value="0x5f0f3cf5"/>
+    <flags value="00000000 00000011"/>
+    <unitsPerEm value="1000"/>
+    <created value="Fri Jan 15 14:37:13 2021"/>
+    <modified value="Mon Mar 15 12:57:03 2021"/>
+    <xMin value="-141"/>
+    <yMin value="-200"/>
+    <xMax value="751"/>
+    <yMax value="915"/>
+    <macStyle value="00000000 00000000"/>
+    <lowestRecPPEM value="6"/>
+    <fontDirectionHint value="2"/>
+    <indexToLocFormat value="0"/>
+    <glyphDataFormat value="0"/>
+  </head>
+
+  <hhea>
+    <tableVersion value="0x00010000"/>
+    <ascent value="1000"/>
+    <descent value="-200"/>
+    <lineGap value="0"/>
+    <advanceWidthMax value="756"/>
+    <minLeftSideBearing value="-141"/>
+    <minRightSideBearing value="-125"/>
+    <xMaxExtent value="751"/>
+    <caretSlopeRise value="1"/>
+    <caretSlopeRun value="0"/>
+    <caretOffset value="0"/>
+    <reserved0 value="0"/>
+    <reserved1 value="0"/>
+    <reserved2 value="0"/>
+    <reserved3 value="0"/>
+    <metricDataFormat value="0"/>
+    <numberOfHMetrics value="10"/>
+  </hhea>
+
+  <maxp>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="0x10000"/>
+    <numGlyphs value="10"/>
+    <maxPoints value="52"/>
+    <maxContours value="3"/>
+    <maxCompositePoints value="16"/>
+    <maxCompositeContours value="4"/>
+    <maxZones value="1"/>
+    <maxTwilightPoints value="0"/>
+    <maxStorage value="0"/>
+    <maxFunctionDefs value="0"/>
+    <maxInstructionDefs value="0"/>
+    <maxStackElements value="0"/>
+    <maxSizeOfInstructions value="0"/>
+    <maxComponentElements value="2"/>
+    <maxComponentDepth value="1"/>
+  </maxp>
+
+  <OS_2>
+    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+         will be recalculated by the compiler -->
+    <version value="4"/>
+    <xAvgCharWidth value="604"/>
+    <usWeightClass value="400"/>
+    <usWidthClass value="5"/>
+    <fsType value="00000000 00001000"/>
+    <ySubscriptXSize value="650"/>
+    <ySubscriptYSize value="600"/>
+    <ySubscriptXOffset value="0"/>
+    <ySubscriptYOffset value="75"/>
+    <ySuperscriptXSize value="650"/>
+    <ySuperscriptYSize value="600"/>
+    <ySuperscriptXOffset value="0"/>
+    <ySuperscriptYOffset value="350"/>
+    <yStrikeoutSize value="50"/>
+    <yStrikeoutPosition value="300"/>
+    <sFamilyClass value="0"/>
+    <panose>
+      <bFamilyType value="0"/>
+      <bSerifStyle value="0"/>
+      <bWeight value="0"/>
+      <bProportion value="0"/>
+      <bContrast value="0"/>
+      <bStrokeVariation value="0"/>
+      <bArmStyle value="0"/>
+      <bLetterForm value="0"/>
+      <bMidline value="0"/>
+      <bXHeight value="0"/>
+    </panose>
+    <ulUnicodeRange1 value="00000000 00000000 00000000 01000011"/>
+    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+    <achVendID value="NONE"/>
+    <fsSelection value="00000000 01000000"/>
+    <usFirstCharIndex value="32"/>
+    <usLastCharIndex value="769"/>
+    <sTypoAscender value="800"/>
+    <sTypoDescender value="-200"/>
+    <sTypoLineGap value="200"/>
+    <usWinAscent value="1000"/>
+    <usWinDescent value="200"/>
+    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+    <sxHeight value="500"/>
+    <sCapHeight value="700"/>
+    <usDefaultChar value="0"/>
+    <usBreakChar value="32"/>
+    <usMaxContext value="2"/>
+  </OS_2>
+
+  <hmtx>
+    <mtx name=".notdef" width="500" lsb="50"/>
+    <mtx name="A" width="756" lsb="5"/>
+    <mtx name="Aacute" width="756" lsb="5"/>
+    <mtx name="O" width="664" lsb="30"/>
+    <mtx name="V" width="756" lsb="5"/>
+    <mtx name="acutecomb" width="0" lsb="-141"/>
+    <mtx name="dollar" width="600" lsb="29"/>
+    <mtx name="dollar.BRACKET.500" width="600" lsb="29"/>
+    <mtx name="dollar.bold" width="600" lsb="29"/>
+    <mtx name="space" width="200" lsb="0"/>
+  </hmtx>
+
+  <cmap>
+    <tableVersion version="0"/>
+    <cmap_format_4 platformID="0" platEncID="3" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+    <cmap_format_4 platformID="3" platEncID="1" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+  </cmap>
+
+  <loca>
+    <!-- The 'loca' table will be calculated by the compiler -->
+  </loca>
+
+  <glyf>
+
+    <!-- The xMin, yMin, xMax and yMax values
+         will be recalculated by the compiler. -->
+
+    <TTGlyph name=".notdef" xMin="50" yMin="-200" xMax="450" yMax="800">
+      <contour>
+        <pt x="50" y="-200" on="1"/>
+        <pt x="50" y="800" on="1"/>
+        <pt x="450" y="800" on="1"/>
+        <pt x="450" y="-200" on="1"/>
+      </contour>
+      <contour>
+        <pt x="100" y="-150" on="1"/>
+        <pt x="400" y="-150" on="1"/>
+        <pt x="400" y="750" on="1"/>
+        <pt x="100" y="750" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="A" xMin="5" yMin="0" xMax="751" yMax="700">
+      <contour>
+        <pt x="641" y="0" on="1"/>
+        <pt x="751" y="0" on="1"/>
+        <pt x="433" y="700" on="1"/>
+        <pt x="323" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="5" y="0" on="1"/>
+        <pt x="115" y="0" on="1"/>
+        <pt x="433" y="700" on="1"/>
+        <pt x="323" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="567" y="284" on="1"/>
+        <pt x="152" y="284" on="1"/>
+        <pt x="152" y="204" on="1"/>
+        <pt x="567" y="204" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="Aacute" xMin="5" yMin="0" xMax="751" yMax="915">
+      <component glyphName="A" x="0" y="0" flags="0x204"/>
+      <component glyphName="acutecomb" x="402" y="130" flags="0x4"/>
+    </TTGlyph>
+
+    <TTGlyph name="O" xMin="30" yMin="-10" xMax="634" yMax="710">
+      <contour>
+        <pt x="332" y="-10" on="1"/>
+        <pt x="181" y="-10" on="0"/>
+        <pt x="30" y="169" on="0"/>
+        <pt x="30" y="350" on="1"/>
+        <pt x="30" y="531" on="0"/>
+        <pt x="181" y="710" on="0"/>
+        <pt x="332" y="710" on="1"/>
+        <pt x="484" y="710" on="0"/>
+        <pt x="634" y="531" on="0"/>
+        <pt x="634" y="350" on="1"/>
+        <pt x="634" y="169" on="0"/>
+        <pt x="484" y="-10" on="0"/>
+      </contour>
+      <contour>
+        <pt x="332" y="74" on="1"/>
+        <pt x="438" y="74" on="0"/>
+        <pt x="544" y="212" on="0"/>
+        <pt x="544" y="350" on="1"/>
+        <pt x="544" y="488" on="0"/>
+        <pt x="438" y="626" on="0"/>
+        <pt x="332" y="626" on="1"/>
+        <pt x="226" y="626" on="0"/>
+        <pt x="120" y="488" on="0"/>
+        <pt x="120" y="350" on="1"/>
+        <pt x="120" y="212" on="0"/>
+        <pt x="226" y="74" on="0"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="V" xMin="5" yMin="0" xMax="751" yMax="700">
+      <contour>
+        <pt x="323" y="0" on="1"/>
+        <pt x="641" y="700" on="1"/>
+        <pt x="751" y="700" on="1"/>
+        <pt x="433" y="0" on="1"/>
+      </contour>
+      <contour>
+        <pt x="323" y="0" on="1"/>
+        <pt x="5" y="700" on="1"/>
+        <pt x="115" y="700" on="1"/>
+        <pt x="433" y="0" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="acutecomb" xMin="-141" yMin="630" xMax="125" yMax="785">
+      <contour>
+        <pt x="-118" y="716" on="1"/>
+        <pt x="-141" y="630" on="1"/>
+        <pt x="102" y="699" on="1"/>
+        <pt x="125" y="785" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar" xMin="29" yMin="-68" xMax="580" yMax="759">
+      <contour>
+        <pt x="264" y="759" on="1"/>
+        <pt x="354" y="759" on="1"/>
+        <pt x="354" y="715" on="1"/>
+        <pt x="415" y="709" on="0"/>
+        <pt x="519" y="662" on="0"/>
+        <pt x="562" y="620" on="1"/>
+        <pt x="509" y="548" on="1"/>
+        <pt x="473" y="584" on="0"/>
+        <pt x="398" y="621" on="0"/>
+        <pt x="354" y="627" on="1"/>
+        <pt x="354" y="373" on="1"/>
+        <pt x="467" y="351" on="0"/>
+        <pt x="580" y="263" on="0"/>
+        <pt x="580" y="184" on="1"/>
+        <pt x="580" y="102" on="0"/>
+        <pt x="459" y="-8" on="0"/>
+        <pt x="354" y="-18" on="1"/>
+        <pt x="354" y="-68" on="1"/>
+        <pt x="264" y="-68" on="1"/>
+        <pt x="264" y="-18" on="1"/>
+        <pt x="192" y="-12" on="0"/>
+        <pt x="72" y="34" on="0"/>
+        <pt x="29" y="74" on="1"/>
+        <pt x="81" y="146" on="1"/>
+        <pt x="123" y="110" on="0"/>
+        <pt x="207" y="73" on="0"/>
+        <pt x="264" y="69" on="1"/>
+        <pt x="264" y="301" on="1"/>
+        <pt x="249" y="304" on="1"/>
+        <pt x="148" y="323" on="0"/>
+        <pt x="43" y="420" on="0"/>
+        <pt x="43" y="502" on="1"/>
+        <pt x="43" y="559" on="0"/>
+        <pt x="99" y="650" on="0"/>
+        <pt x="199" y="707" on="0"/>
+        <pt x="264" y="715" on="1"/>
+      </contour>
+      <contour>
+        <pt x="137" y="502" on="1"/>
+        <pt x="137" y="470" on="0"/>
+        <pt x="160" y="428" on="0"/>
+        <pt x="214" y="402" on="0"/>
+        <pt x="261" y="392" on="1"/>
+        <pt x="264" y="627" on="1"/>
+        <pt x="203" y="618" on="0"/>
+        <pt x="137" y="553" on="0"/>
+      </contour>
+      <contour>
+        <pt x="354" y="69" on="1"/>
+        <pt x="423" y="76" on="0"/>
+        <pt x="486" y="135" on="0"/>
+        <pt x="486" y="183" on="1"/>
+        <pt x="486" y="211" on="0"/>
+        <pt x="462" y="250" on="0"/>
+        <pt x="405" y="275" on="0"/>
+        <pt x="354" y="285" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.BRACKET.500" xMin="29" yMin="-76" xMax="580" yMax="759">
+      <contour>
+        <pt x="264" y="759" on="1"/>
+        <pt x="354" y="759" on="1"/>
+        <pt x="354" y="715" on="1"/>
+        <pt x="415" y="709" on="0"/>
+        <pt x="519" y="662" on="0"/>
+        <pt x="562" y="620" on="1"/>
+        <pt x="509" y="548" on="1"/>
+        <pt x="464" y="592" on="0"/>
+        <pt x="370" y="630" on="0"/>
+        <pt x="308" y="630" on="1"/>
+        <pt x="226" y="630" on="0"/>
+        <pt x="137" y="562" on="0"/>
+        <pt x="137" y="502" on="1"/>
+        <pt x="137" y="470" on="0"/>
+        <pt x="160" y="428" on="0"/>
+        <pt x="214" y="402" on="0"/>
+        <pt x="261" y="392" on="1"/>
+        <pt x="360" y="372" on="1"/>
+        <pt x="469" y="350" on="0"/>
+        <pt x="580" y="263" on="0"/>
+        <pt x="580" y="184" on="1"/>
+        <pt x="580" y="102" on="0"/>
+        <pt x="459" y="-8" on="0"/>
+        <pt x="354" y="-18" on="1"/>
+        <pt x="354" y="-76" on="1"/>
+        <pt x="264" y="-76" on="1"/>
+        <pt x="264" y="-18" on="1"/>
+        <pt x="192" y="-12" on="0"/>
+        <pt x="72" y="34" on="0"/>
+        <pt x="29" y="74" on="1"/>
+        <pt x="81" y="146" on="1"/>
+        <pt x="115" y="118" on="0"/>
+        <pt x="180" y="83" on="0"/>
+        <pt x="259" y="67" on="0"/>
+        <pt x="310" y="67" on="1"/>
+        <pt x="403" y="67" on="0"/>
+        <pt x="486" y="128" on="0"/>
+        <pt x="486" y="183" on="1"/>
+        <pt x="486" y="212" on="0"/>
+        <pt x="461" y="251" on="0"/>
+        <pt x="401" y="277" on="0"/>
+        <pt x="348" y="286" on="1"/>
+        <pt x="249" y="304" on="1"/>
+        <pt x="148" y="323" on="0"/>
+        <pt x="43" y="420" on="0"/>
+        <pt x="43" y="502" on="1"/>
+        <pt x="43" y="559" on="0"/>
+        <pt x="99" y="650" on="0"/>
+        <pt x="199" y="707" on="0"/>
+        <pt x="264" y="715" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.bold" xMin="29" yMin="-76" xMax="580" yMax="759">
+      <contour>
+        <pt x="264" y="759" on="1"/>
+        <pt x="354" y="759" on="1"/>
+        <pt x="354" y="715" on="1"/>
+        <pt x="415" y="709" on="0"/>
+        <pt x="519" y="662" on="0"/>
+        <pt x="562" y="620" on="1"/>
+        <pt x="509" y="548" on="1"/>
+        <pt x="464" y="592" on="0"/>
+        <pt x="370" y="630" on="0"/>
+        <pt x="308" y="630" on="1"/>
+        <pt x="226" y="630" on="0"/>
+        <pt x="137" y="562" on="0"/>
+        <pt x="137" y="502" on="1"/>
+        <pt x="137" y="470" on="0"/>
+        <pt x="160" y="428" on="0"/>
+        <pt x="214" y="402" on="0"/>
+        <pt x="261" y="392" on="1"/>
+        <pt x="360" y="372" on="1"/>
+        <pt x="469" y="350" on="0"/>
+        <pt x="580" y="263" on="0"/>
+        <pt x="580" y="184" on="1"/>
+        <pt x="580" y="102" on="0"/>
+        <pt x="459" y="-8" on="0"/>
+        <pt x="354" y="-18" on="1"/>
+        <pt x="354" y="-76" on="1"/>
+        <pt x="264" y="-76" on="1"/>
+        <pt x="264" y="-18" on="1"/>
+        <pt x="192" y="-12" on="0"/>
+        <pt x="72" y="34" on="0"/>
+        <pt x="29" y="74" on="1"/>
+        <pt x="81" y="146" on="1"/>
+        <pt x="115" y="118" on="0"/>
+        <pt x="180" y="83" on="0"/>
+        <pt x="259" y="67" on="0"/>
+        <pt x="310" y="67" on="1"/>
+        <pt x="403" y="67" on="0"/>
+        <pt x="486" y="128" on="0"/>
+        <pt x="486" y="183" on="1"/>
+        <pt x="486" y="212" on="0"/>
+        <pt x="461" y="251" on="0"/>
+        <pt x="401" y="277" on="0"/>
+        <pt x="348" y="286" on="1"/>
+        <pt x="249" y="304" on="1"/>
+        <pt x="148" y="323" on="0"/>
+        <pt x="43" y="420" on="0"/>
+        <pt x="43" y="502" on="1"/>
+        <pt x="43" y="559" on="0"/>
+        <pt x="99" y="650" on="0"/>
+        <pt x="199" y="707" on="0"/>
+        <pt x="264" y="715" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="space"/><!-- contains no outline data -->
+
+  </glyf>
+
+  <name>
+    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis
+    </namerecord>
+    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+      Regular
+    </namerecord>
+    <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+      1.000;NONE;SimpleTwoAxis-Regular
+    </namerecord>
+    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis Regular
+    </namerecord>
+    <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+      Version 1.000
+    </namerecord>
+    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+      SimpleTwoAxis-Regular
+    </namerecord>
+  </name>
+
+  <post>
+    <formatType value="2.0"/>
+    <italicAngle value="0.0"/>
+    <underlinePosition value="-100"/>
+    <underlineThickness value="50"/>
+    <isFixedPitch value="0"/>
+    <minMemType42 value="0"/>
+    <maxMemType42 value="0"/>
+    <minMemType1 value="0"/>
+    <maxMemType1 value="0"/>
+    <psNames>
+      <!-- This file uses unique glyph names based on the information
+           found in the 'post' table. Since these names might not be unique,
+           we have to invent artificial names in case of clashes. In order to
+           be able to retain the original information, we need a name to
+           ps name mapping for those cases where they differ. That's what
+           you see below.
+            -->
+    </psNames>
+    <extraNames>
+      <!-- following are the name that are not taken from the standard Mac glyph order -->
+      <psName name="dollar.bold"/>
+      <psName name="acutecomb"/>
+      <psName name="dollar.BRACKET.500"/>
+    </extraNames>
+  </post>
+
+  <GDEF>
+    <Version value="0x00010000"/>
+    <GlyphClassDef Format="2">
+      <ClassDef glyph="A" class="1"/>
+      <ClassDef glyph="Aacute" class="1"/>
+      <ClassDef glyph="acutecomb" class="3"/>
+    </GlyphClassDef>
+  </GDEF>
+
+  <GPOS>
+    <Version value="0x00010000"/>
+    <ScriptList>
+      <!-- ScriptCount=1 -->
+      <ScriptRecord index="0">
+        <ScriptTag value="DFLT"/>
+        <Script>
+          <DefaultLangSys>
+            <ReqFeatureIndex value="65535"/>
+            <!-- FeatureCount=2 -->
+            <FeatureIndex index="0" value="0"/>
+            <FeatureIndex index="1" value="1"/>
+          </DefaultLangSys>
+          <!-- LangSysCount=0 -->
+        </Script>
+      </ScriptRecord>
+    </ScriptList>
+    <FeatureList>
+      <!-- FeatureCount=2 -->
+      <FeatureRecord index="0">
+        <FeatureTag value="kern"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="0"/>
+        </Feature>
+      </FeatureRecord>
+      <FeatureRecord index="1">
+        <FeatureTag value="mark"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="1"/>
+        </Feature>
+      </FeatureRecord>
+    </FeatureList>
+    <LookupList>
+      <!-- LookupCount=2 -->
+      <Lookup index="0">
+        <LookupType value="2"/>
+        <LookupFlag value="8"/><!-- ignoreMarks -->
+        <!-- SubTableCount=1 -->
+        <PairPos index="0" Format="1">
+          <Coverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+            <Glyph value="V"/>
+          </Coverage>
+          <ValueFormat1 value="4"/>
+          <ValueFormat2 value="0"/>
+          <!-- PairSetCount=3 -->
+          <PairSet index="0">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="1">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="2">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="O"/>
+              <Value1 XAdvance="-20"/>
+            </PairValueRecord>
+          </PairSet>
+        </PairPos>
+      </Lookup>
+      <Lookup index="1">
+        <LookupType value="4"/>
+        <LookupFlag value="0"/>
+        <!-- SubTableCount=1 -->
+        <MarkBasePos index="0" Format="1">
+          <MarkCoverage Format="1">
+            <Glyph value="acutecomb"/>
+          </MarkCoverage>
+          <BaseCoverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+          </BaseCoverage>
+          <!-- ClassCount=1 -->
+          <MarkArray>
+            <!-- MarkCount=1 -->
+            <MarkRecord index="0">
+              <Class value="0"/>
+              <MarkAnchor Format="1">
+                <XCoordinate value="4"/>
+                <YCoordinate value="623"/>
+              </MarkAnchor>
+            </MarkRecord>
+          </MarkArray>
+          <BaseArray>
+            <!-- BaseCount=2 -->
+            <BaseRecord index="0">
+              <BaseAnchor index="0" Format="1">
+                <XCoordinate value="406"/>
+                <YCoordinate value="753"/>
+              </BaseAnchor>
+            </BaseRecord>
+            <BaseRecord index="1">
+              <BaseAnchor index="0" Format="1">
+                <XCoordinate value="406"/>
+                <YCoordinate value="753"/>
+              </BaseAnchor>
+            </BaseRecord>
+          </BaseArray>
+        </MarkBasePos>
+      </Lookup>
+    </LookupList>
+  </GPOS>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_incompatible_lookup_types/IncompatibleLookupTypes-Bold.ttx b/Tests/varLib/data/master_incompatible_lookup_types/IncompatibleLookupTypes-Bold.ttx
new file mode 100644
--- /dev/null
+++ b/Tests/varLib/data/master_incompatible_lookup_types/IncompatibleLookupTypes-Bold.ttx
@@ -0,0 +1,622 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.20">
+
+  <GlyphOrder>
+    <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+    <GlyphID id="0" name=".notdef"/>
+    <GlyphID id="1" name="A"/>
+    <GlyphID id="2" name="Aacute"/>
+    <GlyphID id="3" name="O"/>
+    <GlyphID id="4" name="V"/>
+    <GlyphID id="5" name="space"/>
+    <GlyphID id="6" name="dollar"/>
+    <GlyphID id="7" name="dollar.bold"/>
+    <GlyphID id="8" name="acutecomb"/>
+    <GlyphID id="9" name="dollar.BRACKET.500"/>
+  </GlyphOrder>
+
+  <head>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="1.0"/>
+    <fontRevision value="1.0"/>
+    <checkSumAdjustment value="0x10cb3f3"/>
+    <magicNumber value="0x5f0f3cf5"/>
+    <flags value="00000000 00000011"/>
+    <unitsPerEm value="1000"/>
+    <created value="Fri Jan 15 14:37:13 2021"/>
+    <modified value="Mon Mar 15 12:57:03 2021"/>
+    <xMin value="-141"/>
+    <yMin value="-200"/>
+    <xMax value="906"/>
+    <yMax value="949"/>
+    <macStyle value="00000000 00000001"/>
+    <lowestRecPPEM value="6"/>
+    <fontDirectionHint value="2"/>
+    <indexToLocFormat value="0"/>
+    <glyphDataFormat value="0"/>
+  </head>
+
+  <hhea>
+    <tableVersion value="0x00010000"/>
+    <ascent value="1000"/>
+    <descent value="-200"/>
+    <lineGap value="0"/>
+    <advanceWidthMax value="911"/>
+    <minLeftSideBearing value="-141"/>
+    <minRightSideBearing value="-125"/>
+    <xMaxExtent value="906"/>
+    <caretSlopeRise value="1"/>
+    <caretSlopeRun value="0"/>
+    <caretOffset value="0"/>
+    <reserved0 value="0"/>
+    <reserved1 value="0"/>
+    <reserved2 value="0"/>
+    <reserved3 value="0"/>
+    <metricDataFormat value="0"/>
+    <numberOfHMetrics value="10"/>
+  </hhea>
+
+  <maxp>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="0x10000"/>
+    <numGlyphs value="10"/>
+    <maxPoints value="52"/>
+    <maxContours value="3"/>
+    <maxCompositePoints value="16"/>
+    <maxCompositeContours value="4"/>
+    <maxZones value="1"/>
+    <maxTwilightPoints value="0"/>
+    <maxStorage value="0"/>
+    <maxFunctionDefs value="0"/>
+    <maxInstructionDefs value="0"/>
+    <maxStackElements value="0"/>
+    <maxSizeOfInstructions value="0"/>
+    <maxComponentElements value="2"/>
+    <maxComponentDepth value="1"/>
+  </maxp>
+
+  <OS_2>
+    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+         will be recalculated by the compiler -->
+    <version value="4"/>
+    <xAvgCharWidth value="672"/>
+    <usWeightClass value="400"/>
+    <usWidthClass value="5"/>
+    <fsType value="00000000 00001000"/>
+    <ySubscriptXSize value="650"/>
+    <ySubscriptYSize value="600"/>
+    <ySubscriptXOffset value="0"/>
+    <ySubscriptYOffset value="75"/>
+    <ySuperscriptXSize value="650"/>
+    <ySuperscriptYSize value="600"/>
+    <ySuperscriptXOffset value="0"/>
+    <ySuperscriptYOffset value="350"/>
+    <yStrikeoutSize value="50"/>
+    <yStrikeoutPosition value="300"/>
+    <sFamilyClass value="0"/>
+    <panose>
+      <bFamilyType value="0"/>
+      <bSerifStyle value="0"/>
+      <bWeight value="0"/>
+      <bProportion value="0"/>
+      <bContrast value="0"/>
+      <bStrokeVariation value="0"/>
+      <bArmStyle value="0"/>
+      <bLetterForm value="0"/>
+      <bMidline value="0"/>
+      <bXHeight value="0"/>
+    </panose>
+    <ulUnicodeRange1 value="00000000 00000000 00000000 01000011"/>
+    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+    <achVendID value="NONE"/>
+    <fsSelection value="00000000 00100000"/>
+    <usFirstCharIndex value="32"/>
+    <usLastCharIndex value="769"/>
+    <sTypoAscender value="800"/>
+    <sTypoDescender value="-200"/>
+    <sTypoLineGap value="200"/>
+    <usWinAscent value="1000"/>
+    <usWinDescent value="200"/>
+    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+    <sxHeight value="500"/>
+    <sCapHeight value="700"/>
+    <usDefaultChar value="0"/>
+    <usBreakChar value="32"/>
+    <usMaxContext value="2"/>
+  </OS_2>
+
+  <hmtx>
+    <mtx name=".notdef" width="500" lsb="50"/>
+    <mtx name="A" width="911" lsb="5"/>
+    <mtx name="Aacute" width="911" lsb="5"/>
+    <mtx name="O" width="715" lsb="15"/>
+    <mtx name="V" width="911" lsb="5"/>
+    <mtx name="acutecomb" width="0" lsb="-141"/>
+    <mtx name="dollar" width="600" lsb="1"/>
+    <mtx name="dollar.BRACKET.500" width="600" lsb="1"/>
+    <mtx name="dollar.bold" width="600" lsb="1"/>
+    <mtx name="space" width="300" lsb="0"/>
+  </hmtx>
+
+  <cmap>
+    <tableVersion version="0"/>
+    <cmap_format_4 platformID="0" platEncID="3" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+    <cmap_format_4 platformID="3" platEncID="1" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+  </cmap>
+
+  <loca>
+    <!-- The 'loca' table will be calculated by the compiler -->
+  </loca>
+
+  <glyf>
+
+    <!-- The xMin, yMin, xMax and yMax values
+         will be recalculated by the compiler. -->
+
+    <TTGlyph name=".notdef" xMin="50" yMin="-200" xMax="450" yMax="800">
+      <contour>
+        <pt x="50" y="-200" on="1"/>
+        <pt x="50" y="800" on="1"/>
+        <pt x="450" y="800" on="1"/>
+        <pt x="450" y="-200" on="1"/>
+      </contour>
+      <contour>
+        <pt x="100" y="-150" on="1"/>
+        <pt x="400" y="-150" on="1"/>
+        <pt x="400" y="750" on="1"/>
+        <pt x="100" y="750" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="A" xMin="5" yMin="0" xMax="906" yMax="700">
+      <contour>
+        <pt x="705" y="0" on="1"/>
+        <pt x="906" y="0" on="1"/>
+        <pt x="556" y="700" on="1"/>
+        <pt x="355" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="5" y="0" on="1"/>
+        <pt x="206" y="0" on="1"/>
+        <pt x="556" y="700" on="1"/>
+        <pt x="355" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="640" y="311" on="1"/>
+        <pt x="190" y="311" on="1"/>
+        <pt x="190" y="191" on="1"/>
+        <pt x="640" y="191" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="Aacute" xMin="5" yMin="0" xMax="906" yMax="949">
+      <component glyphName="A" x="0" y="0" flags="0x204"/>
+      <component glyphName="acutecomb" x="479" y="124" flags="0x4"/>
+    </TTGlyph>
+
+    <TTGlyph name="O" xMin="15" yMin="-10" xMax="670" yMax="710">
+      <contour>
+        <pt x="342" y="-10" on="1"/>
+        <pt x="172" y="-10" on="0"/>
+        <pt x="15" y="163" on="0"/>
+        <pt x="15" y="350" on="1"/>
+        <pt x="15" y="538" on="0"/>
+        <pt x="172" y="710" on="0"/>
+        <pt x="342" y="710" on="1"/>
+        <pt x="513" y="710" on="0"/>
+        <pt x="670" y="538" on="0"/>
+        <pt x="670" y="350" on="1"/>
+        <pt x="670" y="163" on="0"/>
+        <pt x="513" y="-10" on="0"/>
+      </contour>
+      <contour>
+        <pt x="342" y="153" on="1"/>
+        <pt x="419" y="153" on="0"/>
+        <pt x="490" y="247" on="0"/>
+        <pt x="490" y="350" on="1"/>
+        <pt x="490" y="453" on="0"/>
+        <pt x="419" y="547" on="0"/>
+        <pt x="342" y="547" on="1"/>
+        <pt x="266" y="547" on="0"/>
+        <pt x="195" y="453" on="0"/>
+        <pt x="195" y="350" on="1"/>
+        <pt x="195" y="247" on="0"/>
+        <pt x="266" y="153" on="0"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="V" xMin="5" yMin="0" xMax="906" yMax="700">
+      <contour>
+        <pt x="355" y="0" on="1"/>
+        <pt x="705" y="700" on="1"/>
+        <pt x="906" y="700" on="1"/>
+        <pt x="556" y="0" on="1"/>
+      </contour>
+      <contour>
+        <pt x="355" y="0" on="1"/>
+        <pt x="5" y="700" on="1"/>
+        <pt x="206" y="700" on="1"/>
+        <pt x="556" y="0" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="acutecomb" xMin="-141" yMin="630" xMax="125" yMax="825">
+      <contour>
+        <pt x="-118" y="756" on="1"/>
+        <pt x="-141" y="630" on="1"/>
+        <pt x="102" y="699" on="1"/>
+        <pt x="125" y="825" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar" xMin="1" yMin="-98" xMax="595" yMax="789">
+      <contour>
+        <pt x="249" y="789" on="1"/>
+        <pt x="369" y="789" on="1"/>
+        <pt x="369" y="743" on="1"/>
+        <pt x="427" y="735" on="0"/>
+        <pt x="537" y="681" on="0"/>
+        <pt x="590" y="623" on="1"/>
+        <pt x="510" y="515" on="1"/>
+        <pt x="479" y="549" on="0"/>
+        <pt x="411" y="588" on="0"/>
+        <pt x="369" y="595" on="1"/>
+        <pt x="369" y="400" on="1"/>
+        <pt x="476" y="378" on="0"/>
+        <pt x="595" y="278" on="0"/>
+        <pt x="595" y="184" on="1"/>
+        <pt x="595" y="93" on="0"/>
+        <pt x="474" y="-32" on="0"/>
+        <pt x="369" y="-46" on="1"/>
+        <pt x="369" y="-98" on="1"/>
+        <pt x="249" y="-98" on="1"/>
+        <pt x="249" y="-47" on="1"/>
+        <pt x="176" y="-39" on="0"/>
+        <pt x="52" y="17" on="0"/>
+        <pt x="1" y="69" on="1"/>
+        <pt x="80" y="179" on="1"/>
+        <pt x="118" y="144" on="0"/>
+        <pt x="195" y="106" on="0"/>
+        <pt x="249" y="100" on="1"/>
+        <pt x="249" y="273" on="1"/>
+        <pt x="246" y="274" on="1"/>
+        <pt x="144" y="294" on="0"/>
+        <pt x="28" y="405" on="0"/>
+        <pt x="28" y="502" on="1"/>
+        <pt x="28" y="567" on="0"/>
+        <pt x="84" y="667" on="0"/>
+        <pt x="184" y="732" on="0"/>
+        <pt x="249" y="742" on="1"/>
+      </contour>
+      <contour>
+        <pt x="152" y="502" on="1"/>
+        <pt x="152" y="480" on="0"/>
+        <pt x="166" y="453" on="0"/>
+        <pt x="208" y="434" on="0"/>
+        <pt x="249" y="424" on="1"/>
+        <pt x="249" y="595" on="1"/>
+        <pt x="199" y="587" on="0"/>
+        <pt x="152" y="538" on="0"/>
+      </contour>
+      <contour>
+        <pt x="369" y="100" on="1"/>
+        <pt x="426" y="107" on="0"/>
+        <pt x="471" y="150" on="0"/>
+        <pt x="471" y="183" on="1"/>
+        <pt x="471" y="201" on="0"/>
+        <pt x="456" y="225" on="0"/>
+        <pt x="412" y="243" on="0"/>
+        <pt x="369" y="252" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.BRACKET.500" xMin="1" yMin="-98" xMax="595" yMax="789">
+      <contour>
+        <pt x="249" y="789" on="1"/>
+        <pt x="369" y="789" on="1"/>
+        <pt x="369" y="743" on="1"/>
+        <pt x="427" y="735" on="0"/>
+        <pt x="537" y="681" on="0"/>
+        <pt x="590" y="623" on="1"/>
+        <pt x="510" y="515" on="1"/>
+        <pt x="468" y="560" on="0"/>
+        <pt x="374" y="600" on="0"/>
+        <pt x="308" y="600" on="1"/>
+        <pt x="227" y="600" on="0"/>
+        <pt x="152" y="548" on="0"/>
+        <pt x="152" y="502" on="1"/>
+        <pt x="152" y="479" on="0"/>
+        <pt x="168" y="450" on="0"/>
+        <pt x="217" y="431" on="0"/>
+        <pt x="264" y="421" on="1"/>
+        <pt x="363" y="401" on="1"/>
+        <pt x="473" y="379" on="0"/>
+        <pt x="595" y="279" on="0"/>
+        <pt x="595" y="184" on="1"/>
+        <pt x="595" y="93" on="0"/>
+        <pt x="474" y="-32" on="0"/>
+        <pt x="369" y="-46" on="1"/>
+        <pt x="369" y="-98" on="1"/>
+        <pt x="249" y="-98" on="1"/>
+        <pt x="249" y="-47" on="1"/>
+        <pt x="176" y="-39" on="0"/>
+        <pt x="52" y="17" on="0"/>
+        <pt x="1" y="69" on="1"/>
+        <pt x="80" y="179" on="1"/>
+        <pt x="112" y="150" on="0"/>
+        <pt x="176" y="114" on="0"/>
+        <pt x="256" y="97" on="0"/>
+        <pt x="310" y="97" on="1"/>
+        <pt x="402" y="97" on="0"/>
+        <pt x="471" y="143" on="0"/>
+        <pt x="471" y="183" on="1"/>
+        <pt x="471" y="203" on="0"/>
+        <pt x="453" y="228" on="0"/>
+        <pt x="399" y="247" on="0"/>
+        <pt x="345" y="256" on="1"/>
+        <pt x="246" y="274" on="1"/>
+        <pt x="144" y="293" on="0"/>
+        <pt x="28" y="405" on="0"/>
+        <pt x="28" y="502" on="1"/>
+        <pt x="28" y="567" on="0"/>
+        <pt x="84" y="667" on="0"/>
+        <pt x="184" y="732" on="0"/>
+        <pt x="249" y="742" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.bold" xMin="1" yMin="-98" xMax="595" yMax="789">
+      <contour>
+        <pt x="249" y="789" on="1"/>
+        <pt x="369" y="789" on="1"/>
+        <pt x="369" y="743" on="1"/>
+        <pt x="427" y="735" on="0"/>
+        <pt x="537" y="681" on="0"/>
+        <pt x="590" y="623" on="1"/>
+        <pt x="510" y="515" on="1"/>
+        <pt x="468" y="560" on="0"/>
+        <pt x="374" y="600" on="0"/>
+        <pt x="308" y="600" on="1"/>
+        <pt x="227" y="600" on="0"/>
+        <pt x="152" y="548" on="0"/>
+        <pt x="152" y="502" on="1"/>
+        <pt x="152" y="479" on="0"/>
+        <pt x="168" y="450" on="0"/>
+        <pt x="217" y="431" on="0"/>
+        <pt x="264" y="421" on="1"/>
+        <pt x="363" y="401" on="1"/>
+        <pt x="473" y="379" on="0"/>
+        <pt x="595" y="279" on="0"/>
+        <pt x="595" y="184" on="1"/>
+        <pt x="595" y="93" on="0"/>
+        <pt x="474" y="-32" on="0"/>
+        <pt x="369" y="-46" on="1"/>
+        <pt x="369" y="-98" on="1"/>
+        <pt x="249" y="-98" on="1"/>
+        <pt x="249" y="-47" on="1"/>
+        <pt x="176" y="-39" on="0"/>
+        <pt x="52" y="17" on="0"/>
+        <pt x="1" y="69" on="1"/>
+        <pt x="80" y="179" on="1"/>
+        <pt x="112" y="150" on="0"/>
+        <pt x="176" y="114" on="0"/>
+        <pt x="256" y="97" on="0"/>
+        <pt x="310" y="97" on="1"/>
+        <pt x="402" y="97" on="0"/>
+        <pt x="471" y="143" on="0"/>
+        <pt x="471" y="183" on="1"/>
+        <pt x="471" y="203" on="0"/>
+        <pt x="453" y="228" on="0"/>
+        <pt x="399" y="247" on="0"/>
+        <pt x="345" y="256" on="1"/>
+        <pt x="246" y="274" on="1"/>
+        <pt x="144" y="293" on="0"/>
+        <pt x="28" y="405" on="0"/>
+        <pt x="28" y="502" on="1"/>
+        <pt x="28" y="567" on="0"/>
+        <pt x="84" y="667" on="0"/>
+        <pt x="184" y="732" on="0"/>
+        <pt x="249" y="742" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="space"/><!-- contains no outline data -->
+
+  </glyf>
+
+  <name>
+    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis
+    </namerecord>
+    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+      Bold
+    </namerecord>
+    <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+      1.000;NONE;SimpleTwoAxis-Bold
+    </namerecord>
+    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis Bold
+    </namerecord>
+    <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+      Version 1.000
+    </namerecord>
+    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+      SimpleTwoAxis-Bold
+    </namerecord>
+  </name>
+
+  <post>
+    <formatType value="2.0"/>
+    <italicAngle value="0.0"/>
+    <underlinePosition value="-100"/>
+    <underlineThickness value="50"/>
+    <isFixedPitch value="0"/>
+    <minMemType42 value="0"/>
+    <maxMemType42 value="0"/>
+    <minMemType1 value="0"/>
+    <maxMemType1 value="0"/>
+    <psNames>
+      <!-- This file uses unique glyph names based on the information
+           found in the 'post' table. Since these names might not be unique,
+           we have to invent artificial names in case of clashes. In order to
+           be able to retain the original information, we need a name to
+           ps name mapping for those cases where they differ. That's what
+           you see below.
+            -->
+    </psNames>
+    <extraNames>
+      <!-- following are the name that are not taken from the standard Mac glyph order -->
+      <psName name="dollar.bold"/>
+      <psName name="acutecomb"/>
+      <psName name="dollar.BRACKET.500"/>
+    </extraNames>
+  </post>
+
+  <GDEF>
+    <Version value="0x00010000"/>
+    <GlyphClassDef Format="2">
+      <ClassDef glyph="A" class="1"/>
+      <ClassDef glyph="Aacute" class="1"/>
+      <ClassDef glyph="acutecomb" class="3"/>
+    </GlyphClassDef>
+  </GDEF>
+
+  <GPOS>
+    <Version value="0x00010000"/>
+    <ScriptList>
+      <!-- ScriptCount=1 -->
+      <ScriptRecord index="0">
+        <ScriptTag value="DFLT"/>
+        <Script>
+          <DefaultLangSys>
+            <ReqFeatureIndex value="65535"/>
+            <!-- FeatureCount=2 -->
+            <FeatureIndex index="0" value="0"/>
+            <FeatureIndex index="1" value="1"/>
+          </DefaultLangSys>
+          <!-- LangSysCount=0 -->
+        </Script>
+      </ScriptRecord>
+    </ScriptList>
+    <FeatureList>
+      <!-- FeatureCount=2 -->
+      <FeatureRecord index="0">
+        <FeatureTag value="kern"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="0"/>
+        </Feature>
+      </FeatureRecord>
+      <FeatureRecord index="1">
+        <FeatureTag value="mark"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="1"/>
+        </Feature>
+      </FeatureRecord>
+    </FeatureList>
+    <LookupList>
+      <!-- LookupCount=2 -->
+      <Lookup index="0">
+        <LookupType value="2"/>
+        <LookupFlag value="8"/><!-- ignoreMarks -->
+        <!-- SubTableCount=1 -->
+        <PairPos index="0" Format="1">
+          <Coverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+            <Glyph value="V"/>
+          </Coverage>
+          <ValueFormat1 value="4"/>
+          <ValueFormat2 value="0"/>
+          <!-- PairSetCount=3 -->
+          <PairSet index="0">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="1">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="2">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="O"/>
+              <Value1 XAdvance="-20"/>
+            </PairValueRecord>
+          </PairSet>
+        </PairPos>
+      </Lookup>
+      <Lookup index="1">
+        <LookupType value="4"/>
+        <LookupFlag value="0"/>
+        <!-- SubTableCount=1 -->
+        <PairPos index="0" Format="1">
+          <Coverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+            <Glyph value="V"/>
+          </Coverage>
+          <ValueFormat1 value="4"/>
+          <ValueFormat2 value="0"/>
+          <!-- PairSetCount=3 -->
+          <PairSet index="0">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="1">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="2">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="O"/>
+              <Value1 XAdvance="-20"/>
+            </PairValueRecord>
+          </PairSet>
+        </PairPos>
+      </Lookup>
+    </LookupList>
+  </GPOS>
+
+</ttFont>
diff --git a/Tests/varLib/data/master_incompatible_lookup_types/IncompatibleLookupTypes-Regular.ttx b/Tests/varLib/data/master_incompatible_lookup_types/IncompatibleLookupTypes-Regular.ttx
new file mode 100644
--- /dev/null
+++ b/Tests/varLib/data/master_incompatible_lookup_types/IncompatibleLookupTypes-Regular.ttx
@@ -0,0 +1,626 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.20">
+
+  <GlyphOrder>
+    <!-- The 'id' attribute is only for humans; it is ignored when parsed. -->
+    <GlyphID id="0" name=".notdef"/>
+    <GlyphID id="1" name="A"/>
+    <GlyphID id="2" name="Aacute"/>
+    <GlyphID id="3" name="O"/>
+    <GlyphID id="4" name="V"/>
+    <GlyphID id="5" name="space"/>
+    <GlyphID id="6" name="dollar"/>
+    <GlyphID id="7" name="dollar.bold"/>
+    <GlyphID id="8" name="acutecomb"/>
+    <GlyphID id="9" name="dollar.BRACKET.500"/>
+  </GlyphOrder>
+
+  <head>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="1.0"/>
+    <fontRevision value="1.0"/>
+    <checkSumAdjustment value="0x3c7bc79b"/>
+    <magicNumber value="0x5f0f3cf5"/>
+    <flags value="00000000 00000011"/>
+    <unitsPerEm value="1000"/>
+    <created value="Fri Jan 15 14:37:13 2021"/>
+    <modified value="Mon Mar 15 12:57:03 2021"/>
+    <xMin value="-141"/>
+    <yMin value="-200"/>
+    <xMax value="751"/>
+    <yMax value="915"/>
+    <macStyle value="00000000 00000000"/>
+    <lowestRecPPEM value="6"/>
+    <fontDirectionHint value="2"/>
+    <indexToLocFormat value="0"/>
+    <glyphDataFormat value="0"/>
+  </head>
+
+  <hhea>
+    <tableVersion value="0x00010000"/>
+    <ascent value="1000"/>
+    <descent value="-200"/>
+    <lineGap value="0"/>
+    <advanceWidthMax value="756"/>
+    <minLeftSideBearing value="-141"/>
+    <minRightSideBearing value="-125"/>
+    <xMaxExtent value="751"/>
+    <caretSlopeRise value="1"/>
+    <caretSlopeRun value="0"/>
+    <caretOffset value="0"/>
+    <reserved0 value="0"/>
+    <reserved1 value="0"/>
+    <reserved2 value="0"/>
+    <reserved3 value="0"/>
+    <metricDataFormat value="0"/>
+    <numberOfHMetrics value="10"/>
+  </hhea>
+
+  <maxp>
+    <!-- Most of this table will be recalculated by the compiler -->
+    <tableVersion value="0x10000"/>
+    <numGlyphs value="10"/>
+    <maxPoints value="52"/>
+    <maxContours value="3"/>
+    <maxCompositePoints value="16"/>
+    <maxCompositeContours value="4"/>
+    <maxZones value="1"/>
+    <maxTwilightPoints value="0"/>
+    <maxStorage value="0"/>
+    <maxFunctionDefs value="0"/>
+    <maxInstructionDefs value="0"/>
+    <maxStackElements value="0"/>
+    <maxSizeOfInstructions value="0"/>
+    <maxComponentElements value="2"/>
+    <maxComponentDepth value="1"/>
+  </maxp>
+
+  <OS_2>
+    <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+         will be recalculated by the compiler -->
+    <version value="4"/>
+    <xAvgCharWidth value="604"/>
+    <usWeightClass value="400"/>
+    <usWidthClass value="5"/>
+    <fsType value="00000000 00001000"/>
+    <ySubscriptXSize value="650"/>
+    <ySubscriptYSize value="600"/>
+    <ySubscriptXOffset value="0"/>
+    <ySubscriptYOffset value="75"/>
+    <ySuperscriptXSize value="650"/>
+    <ySuperscriptYSize value="600"/>
+    <ySuperscriptXOffset value="0"/>
+    <ySuperscriptYOffset value="350"/>
+    <yStrikeoutSize value="50"/>
+    <yStrikeoutPosition value="300"/>
+    <sFamilyClass value="0"/>
+    <panose>
+      <bFamilyType value="0"/>
+      <bSerifStyle value="0"/>
+      <bWeight value="0"/>
+      <bProportion value="0"/>
+      <bContrast value="0"/>
+      <bStrokeVariation value="0"/>
+      <bArmStyle value="0"/>
+      <bLetterForm value="0"/>
+      <bMidline value="0"/>
+      <bXHeight value="0"/>
+    </panose>
+    <ulUnicodeRange1 value="00000000 00000000 00000000 01000011"/>
+    <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+    <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+    <achVendID value="NONE"/>
+    <fsSelection value="00000000 01000000"/>
+    <usFirstCharIndex value="32"/>
+    <usLastCharIndex value="769"/>
+    <sTypoAscender value="800"/>
+    <sTypoDescender value="-200"/>
+    <sTypoLineGap value="200"/>
+    <usWinAscent value="1000"/>
+    <usWinDescent value="200"/>
+    <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+    <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+    <sxHeight value="500"/>
+    <sCapHeight value="700"/>
+    <usDefaultChar value="0"/>
+    <usBreakChar value="32"/>
+    <usMaxContext value="2"/>
+  </OS_2>
+
+  <hmtx>
+    <mtx name=".notdef" width="500" lsb="50"/>
+    <mtx name="A" width="756" lsb="5"/>
+    <mtx name="Aacute" width="756" lsb="5"/>
+    <mtx name="O" width="664" lsb="30"/>
+    <mtx name="V" width="756" lsb="5"/>
+    <mtx name="acutecomb" width="0" lsb="-141"/>
+    <mtx name="dollar" width="600" lsb="29"/>
+    <mtx name="dollar.BRACKET.500" width="600" lsb="29"/>
+    <mtx name="dollar.bold" width="600" lsb="29"/>
+    <mtx name="space" width="200" lsb="0"/>
+  </hmtx>
+
+  <cmap>
+    <tableVersion version="0"/>
+    <cmap_format_4 platformID="0" platEncID="3" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+    <cmap_format_4 platformID="3" platEncID="1" language="0">
+      <map code="0x20" name="space"/><!-- SPACE -->
+      <map code="0x24" name="dollar"/><!-- DOLLAR SIGN -->
+      <map code="0x41" name="A"/><!-- LATIN CAPITAL LETTER A -->
+      <map code="0x4f" name="O"/><!-- LATIN CAPITAL LETTER O -->
+      <map code="0x56" name="V"/><!-- LATIN CAPITAL LETTER V -->
+      <map code="0xc1" name="Aacute"/><!-- LATIN CAPITAL LETTER A WITH ACUTE -->
+      <map code="0x301" name="acutecomb"/><!-- COMBINING ACUTE ACCENT -->
+    </cmap_format_4>
+  </cmap>
+
+  <loca>
+    <!-- The 'loca' table will be calculated by the compiler -->
+  </loca>
+
+  <glyf>
+
+    <!-- The xMin, yMin, xMax and yMax values
+         will be recalculated by the compiler. -->
+
+    <TTGlyph name=".notdef" xMin="50" yMin="-200" xMax="450" yMax="800">
+      <contour>
+        <pt x="50" y="-200" on="1"/>
+        <pt x="50" y="800" on="1"/>
+        <pt x="450" y="800" on="1"/>
+        <pt x="450" y="-200" on="1"/>
+      </contour>
+      <contour>
+        <pt x="100" y="-150" on="1"/>
+        <pt x="400" y="-150" on="1"/>
+        <pt x="400" y="750" on="1"/>
+        <pt x="100" y="750" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="A" xMin="5" yMin="0" xMax="751" yMax="700">
+      <contour>
+        <pt x="641" y="0" on="1"/>
+        <pt x="751" y="0" on="1"/>
+        <pt x="433" y="700" on="1"/>
+        <pt x="323" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="5" y="0" on="1"/>
+        <pt x="115" y="0" on="1"/>
+        <pt x="433" y="700" on="1"/>
+        <pt x="323" y="700" on="1"/>
+      </contour>
+      <contour>
+        <pt x="567" y="284" on="1"/>
+        <pt x="152" y="284" on="1"/>
+        <pt x="152" y="204" on="1"/>
+        <pt x="567" y="204" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="Aacute" xMin="5" yMin="0" xMax="751" yMax="915">
+      <component glyphName="A" x="0" y="0" flags="0x204"/>
+      <component glyphName="acutecomb" x="402" y="130" flags="0x4"/>
+    </TTGlyph>
+
+    <TTGlyph name="O" xMin="30" yMin="-10" xMax="634" yMax="710">
+      <contour>
+        <pt x="332" y="-10" on="1"/>
+        <pt x="181" y="-10" on="0"/>
+        <pt x="30" y="169" on="0"/>
+        <pt x="30" y="350" on="1"/>
+        <pt x="30" y="531" on="0"/>
+        <pt x="181" y="710" on="0"/>
+        <pt x="332" y="710" on="1"/>
+        <pt x="484" y="710" on="0"/>
+        <pt x="634" y="531" on="0"/>
+        <pt x="634" y="350" on="1"/>
+        <pt x="634" y="169" on="0"/>
+        <pt x="484" y="-10" on="0"/>
+      </contour>
+      <contour>
+        <pt x="332" y="74" on="1"/>
+        <pt x="438" y="74" on="0"/>
+        <pt x="544" y="212" on="0"/>
+        <pt x="544" y="350" on="1"/>
+        <pt x="544" y="488" on="0"/>
+        <pt x="438" y="626" on="0"/>
+        <pt x="332" y="626" on="1"/>
+        <pt x="226" y="626" on="0"/>
+        <pt x="120" y="488" on="0"/>
+        <pt x="120" y="350" on="1"/>
+        <pt x="120" y="212" on="0"/>
+        <pt x="226" y="74" on="0"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="V" xMin="5" yMin="0" xMax="751" yMax="700">
+      <contour>
+        <pt x="323" y="0" on="1"/>
+        <pt x="641" y="700" on="1"/>
+        <pt x="751" y="700" on="1"/>
+        <pt x="433" y="0" on="1"/>
+      </contour>
+      <contour>
+        <pt x="323" y="0" on="1"/>
+        <pt x="5" y="700" on="1"/>
+        <pt x="115" y="700" on="1"/>
+        <pt x="433" y="0" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="acutecomb" xMin="-141" yMin="630" xMax="125" yMax="785">
+      <contour>
+        <pt x="-118" y="716" on="1"/>
+        <pt x="-141" y="630" on="1"/>
+        <pt x="102" y="699" on="1"/>
+        <pt x="125" y="785" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar" xMin="29" yMin="-68" xMax="580" yMax="759">
+      <contour>
+        <pt x="264" y="759" on="1"/>
+        <pt x="354" y="759" on="1"/>
+        <pt x="354" y="715" on="1"/>
+        <pt x="415" y="709" on="0"/>
+        <pt x="519" y="662" on="0"/>
+        <pt x="562" y="620" on="1"/>
+        <pt x="509" y="548" on="1"/>
+        <pt x="473" y="584" on="0"/>
+        <pt x="398" y="621" on="0"/>
+        <pt x="354" y="627" on="1"/>
+        <pt x="354" y="373" on="1"/>
+        <pt x="467" y="351" on="0"/>
+        <pt x="580" y="263" on="0"/>
+        <pt x="580" y="184" on="1"/>
+        <pt x="580" y="102" on="0"/>
+        <pt x="459" y="-8" on="0"/>
+        <pt x="354" y="-18" on="1"/>
+        <pt x="354" y="-68" on="1"/>
+        <pt x="264" y="-68" on="1"/>
+        <pt x="264" y="-18" on="1"/>
+        <pt x="192" y="-12" on="0"/>
+        <pt x="72" y="34" on="0"/>
+        <pt x="29" y="74" on="1"/>
+        <pt x="81" y="146" on="1"/>
+        <pt x="123" y="110" on="0"/>
+        <pt x="207" y="73" on="0"/>
+        <pt x="264" y="69" on="1"/>
+        <pt x="264" y="301" on="1"/>
+        <pt x="249" y="304" on="1"/>
+        <pt x="148" y="323" on="0"/>
+        <pt x="43" y="420" on="0"/>
+        <pt x="43" y="502" on="1"/>
+        <pt x="43" y="559" on="0"/>
+        <pt x="99" y="650" on="0"/>
+        <pt x="199" y="707" on="0"/>
+        <pt x="264" y="715" on="1"/>
+      </contour>
+      <contour>
+        <pt x="137" y="502" on="1"/>
+        <pt x="137" y="470" on="0"/>
+        <pt x="160" y="428" on="0"/>
+        <pt x="214" y="402" on="0"/>
+        <pt x="261" y="392" on="1"/>
+        <pt x="264" y="627" on="1"/>
+        <pt x="203" y="618" on="0"/>
+        <pt x="137" y="553" on="0"/>
+      </contour>
+      <contour>
+        <pt x="354" y="69" on="1"/>
+        <pt x="423" y="76" on="0"/>
+        <pt x="486" y="135" on="0"/>
+        <pt x="486" y="183" on="1"/>
+        <pt x="486" y="211" on="0"/>
+        <pt x="462" y="250" on="0"/>
+        <pt x="405" y="275" on="0"/>
+        <pt x="354" y="285" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.BRACKET.500" xMin="29" yMin="-76" xMax="580" yMax="759">
+      <contour>
+        <pt x="264" y="759" on="1"/>
+        <pt x="354" y="759" on="1"/>
+        <pt x="354" y="715" on="1"/>
+        <pt x="415" y="709" on="0"/>
+        <pt x="519" y="662" on="0"/>
+        <pt x="562" y="620" on="1"/>
+        <pt x="509" y="548" on="1"/>
+        <pt x="464" y="592" on="0"/>
+        <pt x="370" y="630" on="0"/>
+        <pt x="308" y="630" on="1"/>
+        <pt x="226" y="630" on="0"/>
+        <pt x="137" y="562" on="0"/>
+        <pt x="137" y="502" on="1"/>
+        <pt x="137" y="470" on="0"/>
+        <pt x="160" y="428" on="0"/>
+        <pt x="214" y="402" on="0"/>
+        <pt x="261" y="392" on="1"/>
+        <pt x="360" y="372" on="1"/>
+        <pt x="469" y="350" on="0"/>
+        <pt x="580" y="263" on="0"/>
+        <pt x="580" y="184" on="1"/>
+        <pt x="580" y="102" on="0"/>
+        <pt x="459" y="-8" on="0"/>
+        <pt x="354" y="-18" on="1"/>
+        <pt x="354" y="-76" on="1"/>
+        <pt x="264" y="-76" on="1"/>
+        <pt x="264" y="-18" on="1"/>
+        <pt x="192" y="-12" on="0"/>
+        <pt x="72" y="34" on="0"/>
+        <pt x="29" y="74" on="1"/>
+        <pt x="81" y="146" on="1"/>
+        <pt x="115" y="118" on="0"/>
+        <pt x="180" y="83" on="0"/>
+        <pt x="259" y="67" on="0"/>
+        <pt x="310" y="67" on="1"/>
+        <pt x="403" y="67" on="0"/>
+        <pt x="486" y="128" on="0"/>
+        <pt x="486" y="183" on="1"/>
+        <pt x="486" y="212" on="0"/>
+        <pt x="461" y="251" on="0"/>
+        <pt x="401" y="277" on="0"/>
+        <pt x="348" y="286" on="1"/>
+        <pt x="249" y="304" on="1"/>
+        <pt x="148" y="323" on="0"/>
+        <pt x="43" y="420" on="0"/>
+        <pt x="43" y="502" on="1"/>
+        <pt x="43" y="559" on="0"/>
+        <pt x="99" y="650" on="0"/>
+        <pt x="199" y="707" on="0"/>
+        <pt x="264" y="715" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="dollar.bold" xMin="29" yMin="-76" xMax="580" yMax="759">
+      <contour>
+        <pt x="264" y="759" on="1"/>
+        <pt x="354" y="759" on="1"/>
+        <pt x="354" y="715" on="1"/>
+        <pt x="415" y="709" on="0"/>
+        <pt x="519" y="662" on="0"/>
+        <pt x="562" y="620" on="1"/>
+        <pt x="509" y="548" on="1"/>
+        <pt x="464" y="592" on="0"/>
+        <pt x="370" y="630" on="0"/>
+        <pt x="308" y="630" on="1"/>
+        <pt x="226" y="630" on="0"/>
+        <pt x="137" y="562" on="0"/>
+        <pt x="137" y="502" on="1"/>
+        <pt x="137" y="470" on="0"/>
+        <pt x="160" y="428" on="0"/>
+        <pt x="214" y="402" on="0"/>
+        <pt x="261" y="392" on="1"/>
+        <pt x="360" y="372" on="1"/>
+        <pt x="469" y="350" on="0"/>
+        <pt x="580" y="263" on="0"/>
+        <pt x="580" y="184" on="1"/>
+        <pt x="580" y="102" on="0"/>
+        <pt x="459" y="-8" on="0"/>
+        <pt x="354" y="-18" on="1"/>
+        <pt x="354" y="-76" on="1"/>
+        <pt x="264" y="-76" on="1"/>
+        <pt x="264" y="-18" on="1"/>
+        <pt x="192" y="-12" on="0"/>
+        <pt x="72" y="34" on="0"/>
+        <pt x="29" y="74" on="1"/>
+        <pt x="81" y="146" on="1"/>
+        <pt x="115" y="118" on="0"/>
+        <pt x="180" y="83" on="0"/>
+        <pt x="259" y="67" on="0"/>
+        <pt x="310" y="67" on="1"/>
+        <pt x="403" y="67" on="0"/>
+        <pt x="486" y="128" on="0"/>
+        <pt x="486" y="183" on="1"/>
+        <pt x="486" y="212" on="0"/>
+        <pt x="461" y="251" on="0"/>
+        <pt x="401" y="277" on="0"/>
+        <pt x="348" y="286" on="1"/>
+        <pt x="249" y="304" on="1"/>
+        <pt x="148" y="323" on="0"/>
+        <pt x="43" y="420" on="0"/>
+        <pt x="43" y="502" on="1"/>
+        <pt x="43" y="559" on="0"/>
+        <pt x="99" y="650" on="0"/>
+        <pt x="199" y="707" on="0"/>
+        <pt x="264" y="715" on="1"/>
+      </contour>
+      <instructions/>
+    </TTGlyph>
+
+    <TTGlyph name="space"/><!-- contains no outline data -->
+
+  </glyf>
+
+  <name>
+    <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis
+    </namerecord>
+    <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+      Regular
+    </namerecord>
+    <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409">
+      1.000;NONE;SimpleTwoAxis-Regular
+    </namerecord>
+    <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+      Simple Two Axis Regular
+    </namerecord>
+    <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409">
+      Version 1.000
+    </namerecord>
+    <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+      SimpleTwoAxis-Regular
+    </namerecord>
+  </name>
+
+  <post>
+    <formatType value="2.0"/>
+    <italicAngle value="0.0"/>
+    <underlinePosition value="-100"/>
+    <underlineThickness value="50"/>
+    <isFixedPitch value="0"/>
+    <minMemType42 value="0"/>
+    <maxMemType42 value="0"/>
+    <minMemType1 value="0"/>
+    <maxMemType1 value="0"/>
+    <psNames>
+      <!-- This file uses unique glyph names based on the information
+           found in the 'post' table. Since these names might not be unique,
+           we have to invent artificial names in case of clashes. In order to
+           be able to retain the original information, we need a name to
+           ps name mapping for those cases where they differ. That's what
+           you see below.
+            -->
+    </psNames>
+    <extraNames>
+      <!-- following are the name that are not taken from the standard Mac glyph order -->
+      <psName name="dollar.bold"/>
+      <psName name="acutecomb"/>
+      <psName name="dollar.BRACKET.500"/>
+    </extraNames>
+  </post>
+
+  <GDEF>
+    <Version value="0x00010000"/>
+    <GlyphClassDef Format="2">
+      <ClassDef glyph="A" class="1"/>
+      <ClassDef glyph="Aacute" class="1"/>
+      <ClassDef glyph="acutecomb" class="3"/>
+    </GlyphClassDef>
+  </GDEF>
+
+  <GPOS>
+    <Version value="0x00010000"/>
+    <ScriptList>
+      <!-- ScriptCount=1 -->
+      <ScriptRecord index="0">
+        <ScriptTag value="DFLT"/>
+        <Script>
+          <DefaultLangSys>
+            <ReqFeatureIndex value="65535"/>
+            <!-- FeatureCount=2 -->
+            <FeatureIndex index="0" value="0"/>
+            <FeatureIndex index="1" value="1"/>
+          </DefaultLangSys>
+          <!-- LangSysCount=0 -->
+        </Script>
+      </ScriptRecord>
+    </ScriptList>
+    <FeatureList>
+      <!-- FeatureCount=2 -->
+      <FeatureRecord index="0">
+        <FeatureTag value="kern"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="0"/>
+        </Feature>
+      </FeatureRecord>
+      <FeatureRecord index="1">
+        <FeatureTag value="mark"/>
+        <Feature>
+          <!-- LookupCount=1 -->
+          <LookupListIndex index="0" value="1"/>
+        </Feature>
+      </FeatureRecord>
+    </FeatureList>
+    <LookupList>
+      <!-- LookupCount=2 -->
+      <Lookup index="0">
+        <LookupType value="2"/>
+        <LookupFlag value="8"/><!-- ignoreMarks -->
+        <!-- SubTableCount=1 -->
+        <PairPos index="0" Format="1">
+          <Coverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+            <Glyph value="V"/>
+          </Coverage>
+          <ValueFormat1 value="4"/>
+          <ValueFormat2 value="0"/>
+          <!-- PairSetCount=3 -->
+          <PairSet index="0">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="1">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="V"/>
+              <Value1 XAdvance="-80"/>
+            </PairValueRecord>
+          </PairSet>
+          <PairSet index="2">
+            <!-- PairValueCount=1 -->
+            <PairValueRecord index="0">
+              <SecondGlyph value="O"/>
+              <Value1 XAdvance="-20"/>
+            </PairValueRecord>
+          </PairSet>
+        </PairPos>
+      </Lookup>
+      <Lookup index="1">
+        <LookupType value="4"/>
+        <LookupFlag value="0"/>
+        <!-- SubTableCount=1 -->
+        <MarkBasePos index="0" Format="1">
+          <MarkCoverage Format="1">
+            <Glyph value="acutecomb"/>
+          </MarkCoverage>
+          <BaseCoverage Format="1">
+            <Glyph value="A"/>
+            <Glyph value="Aacute"/>
+          </BaseCoverage>
+          <!-- ClassCount=1 -->
+          <MarkArray>
+            <!-- MarkCount=1 -->
+            <MarkRecord index="0">
+              <Class value="0"/>
+              <MarkAnchor Format="1">
+                <XCoordinate value="4"/>
+                <YCoordinate value="623"/>
+              </MarkAnchor>
+            </MarkRecord>
+          </MarkArray>
+          <BaseArray>
+            <!-- BaseCount=2 -->
+            <BaseRecord index="0">
+              <BaseAnchor index="0" Format="3">
+                <XCoordinate value="406"/>
+                <YCoordinate value="753"/>
+              </BaseAnchor>
+            </BaseRecord>
+            <BaseRecord index="1">
+              <BaseAnchor index="0" Format="1">
+                <XCoordinate value="406"/>
+                <YCoordinate value="753"/>
+              </BaseAnchor>
+            </BaseRecord>
+          </BaseArray>
+        </MarkBasePos>
+      </Lookup>
+    </LookupList>
+  </GPOS>
+
+</ttFont>
diff --git a/Tests/varLib/varLib_test.py b/Tests/varLib/varLib_test.py
--- a/Tests/varLib/varLib_test.py
+++ b/Tests/varLib/varLib_test.py
@@ -2,6 +2,7 @@
 from fontTools.ttLib import TTFont, newTable
 from fontTools.varLib import build, load_designspace
 from fontTools.varLib.errors import VarLibValidationError
+import fontTools.varLib.errors as varLibErrors
 from fontTools.varLib.mutator import instantiateVariableFont
 from fontTools.varLib import main as varLib_main, load_masters
 from fontTools.varLib import set_default_weight_width_slant
@@ -813,6 +814,62 @@ def test_designspace_fill_in_location(self):
 
         assert ds_loaded.instances[0].location == {"weight": 0, "width": 50}
 
+    def test_varlib_build_incompatible_features(self):
+        with pytest.raises(
+            varLibErrors.ShouldBeConstant,
+            match = """
+
+Couldn't merge the fonts, because some values were different, but should have
+been the same. This happened while performing the following operation:
+GPOS.table.FeatureList.FeatureCount
+
+The problem is likely to be in Simple Two Axis Bold:
+
+Incompatible features between masters.
+Expected: kern, mark.
+Got: kern.
+"""):
+
+            self._run_varlib_build_test(
+                designspace_name="IncompatibleFeatures",
+                font_name="IncompatibleFeatures",
+                tables=["GPOS"],
+                expected_ttx_name="IncompatibleFeatures",
+                save_before_dump=True,
+            )
+
+    def test_varlib_build_incompatible_lookup_types(self):
+        with pytest.raises(
+            varLibErrors.MismatchedTypes,
+            match = r"MarkBasePos, instead saw PairPos"
+        ):
+            self._run_varlib_build_test(
+                designspace_name="IncompatibleLookupTypes",
+                font_name="IncompatibleLookupTypes",
+                tables=["GPOS"],
+                expected_ttx_name="IncompatibleLookupTypes",
+                save_before_dump=True,
+            )
+
+    def test_varlib_build_incompatible_arrays(self):
+        with pytest.raises(
+            varLibErrors.ShouldBeConstant,
+            match = """
+
+Couldn't merge the fonts, because some values were different, but should have
+been the same. This happened while performing the following operation:
+GPOS.table.ScriptList.ScriptCount
+
+The problem is likely to be in Simple Two Axis Bold:
+Expected to see .ScriptCount==1, instead saw 0"""
+        ):
+            self._run_varlib_build_test(
+                designspace_name="IncompatibleArrays",
+                font_name="IncompatibleArrays",
+                tables=["GPOS"],
+                expected_ttx_name="IncompatibleArrays",
+                save_before_dump=True,
+            )
 
 def test_load_masters_layerName_without_required_font():
     ds = DesignSpaceDocument()