Maintain bw compatibility for requesting bad options. Closes: #14255.
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 9c37ffb..0b16266 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -1083,9 +1083,14 @@
         try:
             value_object, value = self.coredata.optstore.get_option_from_meson_file(options.OptionKey(optname, self.subproject))
         except KeyError:
-            if self.subproject:
-                raise MesonException(f'Option {optname} does not exist for subproject {self.subproject}.')
-            raise MesonException(f'Option {optname} does not exist.')
+            if self.coredata.optstore.is_base_option(optname):
+                # Due to backwards compatibility return the default
+                # option for base options instead of erroring out.
+                value_object, value = self.get_default_for_b_option(optname)
+            else:
+                if self.subproject:
+                    raise MesonException(f'Option {optname} does not exist for subproject {self.subproject}.')
+                raise MesonException(f'Option {optname} does not exist.')
         if isinstance(value_object, options.UserFeatureOption):
             ocopy = copy.copy(value_object)
             ocopy.name = optname
diff --git a/mesonbuild/options.py b/mesonbuild/options.py
index 7c22332..609e4a9 100644
--- a/mesonbuild/options.py
+++ b/mesonbuild/options.py
@@ -1101,6 +1101,14 @@
         (value_object, value) = self.get_value_object_and_value_for(key)
         return (value_object, value)
 
+    def get_default_for_b_option(self, keyname: str) -> 'T.Tuple[AnyOptionType, OptionValueType]':
+        assert keyname.startswith('b_')
+        from .compilers.compilers import BASE_OPTIONS
+        for bkey, bvalue in BASE_OPTIONS.items():
+            if bkey.name == keyname:
+                return (bvalue, bvalue.default)
+        raise MesonBugException(f'Requested base option {keyname} which does not exist.')
+
     def remove(self, key: OptionKey) -> None:
         del self.options[key]
         try:
diff --git a/unittests/optiontests.py b/unittests/optiontests.py
index bbf9c0e..fb502fe 100644
--- a/unittests/optiontests.py
+++ b/unittests/optiontests.py
@@ -182,3 +182,8 @@
         optstore.set_subproject_options(subproject, [f'cpp_std={unused_value}'], [f'cpp_std={unused_value}'])
         self.assertEqual(optstore.get_value_for(name), default_value)
         self.assertEqual(optstore.get_value_for(name, subproject), override_value)
+
+    def test_b_default(self):
+        optstore = OptionStore(False)
+        _, value = optstore.get_default_for_b_option('b_vscrt')
+        self.assertEqual(value, 'from_buildtype')