[tint][msl] Add validation support for 2.3

Change-Id: I5070713b88aecaefe53ce876d75b1dd81392281f
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/150144
Auto-Submit: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/cmd/remote_compile/main.cc b/src/tint/cmd/remote_compile/main.cc
index 12f5fdb..95e2c48 100644
--- a/src/tint/cmd/remote_compile/main.cc
+++ b/src/tint/cmd/remote_compile/main.cc
@@ -427,6 +427,9 @@
                     if (req.version_major == 2 && req.version_minor == 1) {
                         version = tint::msl::validate::MslVersion::kMsl_2_1;
                     }
+                    if (req.version_major == 2 && req.version_minor == 3) {
+                        version = tint::msl::validate::MslVersion::kMsl_2_3;
+                    }
                     auto result = tint::msl::validate::UsingMetalAPI(req.source, version);
                     CompileResponse resp;
                     if (result.failed) {
diff --git a/src/tint/lang/msl/validate/msl.cc b/src/tint/lang/msl/validate/msl.cc
index fce70d6..b0c10ad 100644
--- a/src/tint/lang/msl/validate/msl.cc
+++ b/src/tint/lang/msl/validate/msl.cc
@@ -42,6 +42,9 @@
         case MslVersion::kMsl_2_1:
             version_str = "-std=macos-metal2.1";
             break;
+        case MslVersion::kMsl_2_3:
+            version_str = "-std=macos-metal2.3";
+            break;
     }
 
 #ifdef _WIN32
diff --git a/src/tint/lang/msl/validate/msl_metal.mm b/src/tint/lang/msl/validate/msl_metal.mm
index 8fd3ee9..cdd34ad 100644
--- a/src/tint/lang/msl/validate/msl_metal.mm
+++ b/src/tint/lang/msl/validate/msl_metal.mm
@@ -43,6 +43,11 @@
         case MslVersion::kMsl_2_1:
             compileOptions.languageVersion = MTLLanguageVersion2_1;
             break;
+        case MslVersion::kMsl_2_3:
+            if (@available(macOS 11.0, *)) {
+                compileOptions.languageVersion = MTLLanguageVersion2_3;
+            }
+            break;
     }
 
     id<MTLLibrary> library = [device newLibraryWithSource:source
diff --git a/src/tint/lang/msl/validate/val.h b/src/tint/lang/msl/validate/val.h
index ca32763..e9f4037 100644
--- a/src/tint/lang/msl/validate/val.h
+++ b/src/tint/lang/msl/validate/val.h
@@ -30,12 +30,19 @@
 
 using EntryPointList = std::vector<std::pair<std::string, ast::PipelineStage>>;
 
-// The version of MSL to validate against.
+/// The version of MSL to validate against.
+/// Note: these must kept be in ascending order
 enum class MslVersion {
     kMsl_1_2,
     kMsl_2_1,
+    kMsl_2_3,
 };
 
+/// MslVersion less-than operator
+inline bool operator<(MslVersion a, MslVersion b) {
+    return static_cast<int>(a) < static_cast<int>(b);
+}
+
 /// The return structure of Validate()
 struct Result {
     /// True if validation passed