Make objective C use C standard version. Closes #5495.
diff --git a/docs/markdown/snippets/objcversion.md b/docs/markdown/snippets/objcversion.md
new file mode 100644
index 0000000..9825c80
--- /dev/null
+++ b/docs/markdown/snippets/objcversion.md
@@ -0,0 +1,6 @@
+## Objective C/C++ standard versions
+
+Objective C and C++ compilations will from now on use the language
+versions set in `c_std` and `cpp_std`, respectively. It is not
+possible to set the language version separately for Objective C and
+plain C.
diff --git a/mesonbuild/compilers/objc.py b/mesonbuild/compilers/objc.py
index 32f17ff..f707928 100644
--- a/mesonbuild/compilers/objc.py
+++ b/mesonbuild/compilers/objc.py
@@ -14,7 +14,8 @@
 
 import typing as T
 
-from ..mesonlib import MachineChoice
+from .. import coredata
+from ..mesonlib import MachineChoice, OptionKey
 
 from .compilers import Compiler
 from .mixins.clike import CLikeCompiler
@@ -84,6 +85,23 @@
                           '2': default_warn_args + ['-Wextra'],
                           '3': default_warn_args + ['-Wextra', '-Wpedantic']}
 
+    def get_options(self) -> 'KeyedOptionDictType':
+        opts = super().get_options()
+        opts.update({
+            OptionKey('std', machine=self.for_machine, lang='c'): coredata.UserComboOption(
+                'C language standard to use',
+                ['none', 'c89', 'c99', 'c11', 'c17'],
+                'none',
+            )
+        })
+        return opts
+
+    def get_option_compile_args(self, options: 'KeyedOptionDictType') -> T.List[str]:
+        args = []
+        std = options[OptionKey('std', machine=self.for_machine, lang='c')]
+        if std.value != 'none':
+            args.append('-std=' + std.value)
+        return args
 
 class AppleClangObjCCompiler(ClangObjCCompiler):
 
diff --git a/mesonbuild/compilers/objcpp.py b/mesonbuild/compilers/objcpp.py
index 003da54..dbf5ba7 100644
--- a/mesonbuild/compilers/objcpp.py
+++ b/mesonbuild/compilers/objcpp.py
@@ -14,7 +14,8 @@
 
 import typing as T
 
-from ..mesonlib import MachineChoice
+from .. import coredata
+from ..mesonlib import MachineChoice, OptionKey
 
 from .mixins.clike import CLikeCompiler
 from .compilers import Compiler
@@ -85,6 +86,24 @@
                           '3': default_warn_args + ['-Wextra', '-Wpedantic']}
 
 
+    def get_options(self) -> 'KeyedOptionDictType':
+        opts = super().get_options()
+        opts.update({
+            OptionKey('std', machine=self.for_machine, lang='cpp'): coredata.UserComboOption(
+                'C++ language standard to use',
+                ['none', 'c++98', 'c++11', 'c++14', 'c++17'],
+                'none',
+            )
+        })
+        return opts
+
+    def get_option_compile_args(self, options: 'KeyedOptionDictType') -> T.List[str]:
+        args = []
+        std = options[OptionKey('std', machine=self.for_machine, lang='cpp')]
+        if std.value != 'none':
+            args.append('-std=' + std.value)
+        return args
+
 
 class AppleClangObjCPPCompiler(ClangObjCPPCompiler):
 
diff --git a/run_unittests.py b/run_unittests.py
index 1556b10..31debf1 100755
--- a/run_unittests.py
+++ b/run_unittests.py
@@ -1725,6 +1725,9 @@
         self.unit_test_dir = os.path.join(src_root, 'test cases/unit')
         self.rewrite_test_dir = os.path.join(src_root, 'test cases/rewrite')
         self.linuxlike_test_dir = os.path.join(src_root, 'test cases/linuxlike')
+        self.objc_test_dir = os.path.join(src_root, 'test cases/objc')
+        self.objcpp_test_dir = os.path.join(src_root, 'test cases/objcpp')
+
         # Misc stuff
         self.orig_env = os.environ.copy()
         if self.backend is Backend.ninja:
@@ -6452,6 +6455,18 @@
         env = {'CFLAGS': '-L/tmp -L /var/tmp -headerpad_max_install_names -Wl,-export_dynamic -framework Foundation'}
         self.init(testdir, override_envvars=env)
 
+    def test_objc_versions(self):
+        # Objective-C always uses the C standard version.
+        # Objecttive-C++ always uses the C++ standard version.
+        # This is what most people seem to want and in addition
+        # it is the only setup supported by Xcode.
+        testdir = os.path.join(self.objc_test_dir, '1 simple')
+        self.init(testdir)
+        self.assertIn('-std=c99', self.get_compdb()[0]['command'])
+        self.wipe()
+        testdir = os.path.join(self.objcpp_test_dir, '1 simple')
+        self.init(testdir)
+        self.assertIn('-std=c++14', self.get_compdb()[0]['command'])
 
 @unittest.skipUnless(not is_windows(), "requires something Unix-like")
 class LinuxlikeTests(BasePlatformTests):
diff --git a/test cases/objc/1 simple/meson.build b/test cases/objc/1 simple/meson.build
index b004e6b..f9d5c14 100644
--- a/test cases/objc/1 simple/meson.build
+++ b/test cases/objc/1 simple/meson.build
@@ -1,4 +1,4 @@
-project('objective c', 'objc')
+project('objective c', 'objc', default_options: ['c_std=c99'])
 
 exe = executable('prog', 'prog.m')
 test('objctest', exe)
diff --git a/test cases/objcpp/1 simple/meson.build b/test cases/objcpp/1 simple/meson.build
index 7d91884..c9a5c84 100644
--- a/test cases/objcpp/1 simple/meson.build
+++ b/test cases/objcpp/1 simple/meson.build
@@ -1,4 +1,4 @@
-project('Objective C++', 'objcpp')
+project('Objective C++', 'objcpp', default_options: 'cpp_std=c++14')
 
 exe = executable('objcppprog', 'prog.mm')
 test('objcpp', exe)