Author: Wenju He
Date: 2026-06-17T13:00:15+08:00
New Revision: 16d22173dbb1d3e77cfed5bbcc2aca1157350d25

URL: 
https://github.com/llvm/llvm-project/commit/16d22173dbb1d3e77cfed5bbcc2aca1157350d25
DIFF: 
https://github.com/llvm/llvm-project/commit/16d22173dbb1d3e77cfed5bbcc2aca1157350d25.diff

LOG: [Clang][OpenCL] Add OpenCL 3.1 language version (#204043)

OpenCL 3.1 was recently added to spec in
https://github.com/KhronosGroup/OpenCL-Docs/commit/9fff1a87a975

This PR adds version 3.1 to clang support, including frontend flag
`-std=cl3.1` (and its alias `-std=CL3.1`).
Updated release note.

A few extensions are promoted to 3.1 core. They'll be handled in
follow-up PRs.

Assisted-by: Claude Sonnet 4.6

Added: 
    

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/include/clang/Basic/LangStandards.def
    clang/include/clang/Basic/OpenCLOptions.h
    clang/lib/Basic/LangOptions.cpp
    clang/lib/Basic/TargetInfo.cpp
    clang/lib/Frontend/CompilerInvocation.cpp
    clang/lib/Frontend/InitPreprocessor.cpp
    clang/test/Driver/opencl.cl
    clang/test/Driver/unknown-std.cl
    clang/test/Preprocessor/predefined-macros.c
    clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index c5e54b09b5ed4..89909fe27cbb9 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -822,6 +822,10 @@ Miscellaneous Clang Crashes Fixed
 OpenACC Specific Changes
 ------------------------
 
+OpenCL Specific Changes
+-----------------------
+- Added support for OpenCL C 3.1 language version (``-cl-std=CL3.1``).
+
 Target Specific Changes
 -----------------------
 

diff  --git a/clang/include/clang/Basic/LangStandards.def 
b/clang/include/clang/Basic/LangStandards.def
index 4edc93503cdf5..809240978d013 100644
--- a/clang/include/clang/Basic/LangStandards.def
+++ b/clang/include/clang/Basic/LangStandards.def
@@ -209,6 +209,9 @@ LANGSTANDARD(opencl20, "cl2.0",
 LANGSTANDARD(opencl30, "cl3.0",
              OpenCL, "OpenCL 3.0",
              LineComment | C99 | Digraphs | HexFloat | OpenCL, std::nullopt)
+LANGSTANDARD(opencl31, "cl3.1",
+             OpenCL, "OpenCL 3.1",
+             LineComment | C99 | Digraphs | HexFloat | OpenCL, std::nullopt)
 
 LANGSTANDARD(openclcpp10, "clc++1.0",
              OpenCL, "C++ for OpenCL 1.0",
@@ -226,6 +229,7 @@ LANGSTANDARD_ALIAS_DEPR(opencl11, "CL1.1")
 LANGSTANDARD_ALIAS_DEPR(opencl12, "CL1.2")
 LANGSTANDARD_ALIAS_DEPR(opencl20, "CL2.0")
 LANGSTANDARD_ALIAS_DEPR(opencl30, "CL3.0")
+LANGSTANDARD_ALIAS_DEPR(opencl31, "CL3.1")
 LANGSTANDARD_ALIAS_DEPR(openclcpp10, "CLC++")
 LANGSTANDARD_ALIAS_DEPR(openclcpp10, "CLC++1.0")
 LANGSTANDARD_ALIAS_DEPR(openclcpp2021, "CLC++2021")

diff  --git a/clang/include/clang/Basic/OpenCLOptions.h 
b/clang/include/clang/Basic/OpenCLOptions.h
index d6cb1a210519d..ec661bba94adb 100644
--- a/clang/include/clang/Basic/OpenCLOptions.h
+++ b/clang/include/clang/Basic/OpenCLOptions.h
@@ -32,7 +32,8 @@ enum OpenCLVersionID : unsigned int {
   OCL_C_12 = 0x4,
   OCL_C_20 = 0x8,
   OCL_C_30 = 0x10,
-  OCL_C_ALL = 0x1f,
+  OCL_C_31 = 0x20,
+  OCL_C_ALL = 0x3f,
   OCL_C_11P = OCL_C_ALL ^ OCL_C_10,              // OpenCL C 1.1+
   OCL_C_12P = OCL_C_ALL ^ (OCL_C_10 | OCL_C_11), // OpenCL C 1.2+
 };
@@ -51,6 +52,8 @@ static inline OpenCLVersionID encodeOpenCLVersion(unsigned 
OpenCLVersion) {
     return OCL_C_20;
   case 300:
     return OCL_C_30;
+  case 310:
+    return OCL_C_31;
   }
 }
 

diff  --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp
index 7e75bf1221eb7..7e0ee665d4493 100644
--- a/clang/lib/Basic/LangOptions.cpp
+++ b/clang/lib/Basic/LangOptions.cpp
@@ -153,6 +153,8 @@ void LangOptions::setLangDefaults(LangOptions &Opts, 
Language Lang,
     Opts.OpenCLVersion = 200;
   else if (LangStd == LangStandard::lang_opencl30)
     Opts.OpenCLVersion = 300;
+  else if (LangStd == LangStandard::lang_opencl31)
+    Opts.OpenCLVersion = 310;
   else if (LangStd == LangStandard::lang_openclcpp10)
     Opts.OpenCLCPlusPlusVersion = 100;
   else if (LangStd == LangStandard::lang_openclcpp2021)

diff  --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp
index 854d23cadaea2..9a25384347073 100644
--- a/clang/lib/Basic/TargetInfo.cpp
+++ b/clang/lib/Basic/TargetInfo.cpp
@@ -491,7 +491,7 @@ void TargetInfo::adjust(DiagnosticsEngine &Diags, 
LangOptions &Opts,
     // for OpenCL C 2.0 but with no access to target capabilities. Target
     // should be immutable once created and thus these language options need
     // to be defined only once.
-    if (Opts.getOpenCLCompatibleVersion() == 300) {
+    if (Opts.getOpenCLCompatibleVersion() >= 300) {
       const auto &OpenCLFeaturesMap = getSupportedOpenCLOpts();
       Opts.OpenCLGenericAddressSpace = hasFeatureEnabled(
           OpenCLFeaturesMap, "__opencl_c_generic_address_space");

diff  --git a/clang/lib/Frontend/CompilerInvocation.cpp 
b/clang/lib/Frontend/CompilerInvocation.cpp
index c564748ddabc1..d2847739e3143 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -4099,6 +4099,7 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, 
ArgList &Args,
             .Cases({"cl1.2", "CL1.2"}, LangStandard::lang_opencl12)
             .Cases({"cl2.0", "CL2.0"}, LangStandard::lang_opencl20)
             .Cases({"cl3.0", "CL3.0"}, LangStandard::lang_opencl30)
+            .Cases({"cl3.1", "CL3.1"}, LangStandard::lang_opencl31)
             .Cases({"clc++", "CLC++"}, LangStandard::lang_openclcpp10)
             .Cases({"clc++1.0", "CLC++1.0"}, LangStandard::lang_openclcpp10)
             .Cases({"clc++2021", "CLC++2021"}, 
LangStandard::lang_openclcpp2021)

diff  --git a/clang/lib/Frontend/InitPreprocessor.cpp 
b/clang/lib/Frontend/InitPreprocessor.cpp
index 3f0468a938149..ec009211ec6de 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -545,6 +545,9 @@ static void InitializeStandardPredefinedMacros(const 
TargetInfo &TI,
       case 300:
         Builder.defineMacro("__OPENCL_C_VERSION__", "300");
         break;
+      case 310:
+        Builder.defineMacro("__OPENCL_C_VERSION__", "310");
+        break;
       default:
         llvm_unreachable("Unsupported OpenCL version");
       }
@@ -554,6 +557,7 @@ static void InitializeStandardPredefinedMacros(const 
TargetInfo &TI,
     Builder.defineMacro("CL_VERSION_1_2", "120");
     Builder.defineMacro("CL_VERSION_2_0", "200");
     Builder.defineMacro("CL_VERSION_3_0", "300");
+    Builder.defineMacro("CL_VERSION_3_1", "310");
 
     if (TI.isLittleEndian())
       Builder.defineMacro("__ENDIAN_LITTLE__");

diff  --git a/clang/test/Driver/opencl.cl b/clang/test/Driver/opencl.cl
index 5b2a1033de081..ba941d5f48feb 100644
--- a/clang/test/Driver/opencl.cl
+++ b/clang/test/Driver/opencl.cl
@@ -4,6 +4,7 @@
 // RUN: %clang -S -### -cl-std=CL1.2 %s 2>&1 | FileCheck 
--check-prefix=CHECK-CL12 %s
 // RUN: %clang -S -### -cl-std=CL2.0 %s 2>&1 | FileCheck 
--check-prefix=CHECK-CL20 %s
 // RUN: %clang -S -### -cl-std=CL3.0 %s 2>&1 | FileCheck 
--check-prefix=CHECK-CL30 %s
+// RUN: %clang -S -### -cl-std=CL3.1 %s 2>&1 | FileCheck 
--check-prefix=CHECK-CL31 %s
 // RUN: %clang -S -### -cl-std=clc++ %s 2>&1 | FileCheck 
--check-prefix=CHECK-CLCPP %s
 // RUN: %clang -S -### -cl-opt-disable %s 2>&1 | FileCheck 
--check-prefix=CHECK-OPT-DISABLE %s
 // RUN: %clang -S -### -cl-strict-aliasing %s 2>&1 | FileCheck 
--check-prefix=CHECK-STRICT-ALIASING %s
@@ -31,6 +32,7 @@
 // CHECK-CL12: "-cc1" {{.*}} "-cl-std=CL1.2"
 // CHECK-CL20: "-cc1" {{.*}} "-cl-std=CL2.0"
 // CHECK-CL30: "-cc1" {{.*}} "-cl-std=CL3.0"
+// CHECK-CL31: "-cc1" {{.*}} "-cl-std=CL3.1"
 // CHECK-CLCPP: "-cc1" {{.*}} "-cl-std=clc++"
 // CHECK-OPT-DISABLE: "-cc1" {{.*}} "-cl-opt-disable"
 // CHECK-STRICT-ALIASING: "-cc1" {{.*}} "-cl-strict-aliasing"

diff  --git a/clang/test/Driver/unknown-std.cl 
b/clang/test/Driver/unknown-std.cl
index 3570515ad076d..a6d065d9a7d44 100644
--- a/clang/test/Driver/unknown-std.cl
+++ b/clang/test/Driver/unknown-std.cl
@@ -11,6 +11,7 @@
 // CHECK-NEXT: note: use 'cl1.2' for 'OpenCL 1.2' standard
 // CHECK-NEXT: note: use 'cl2.0' for 'OpenCL 2.0' standard
 // CHECK-NEXT: note: use 'cl3.0' for 'OpenCL 3.0' standard
+// CHECK-NEXT: note: use 'cl3.1' for 'OpenCL 3.1' standard
 // CHECK-NEXT: note: use 'clc++1.0' or 'clc++' for 'C++ for OpenCL 1.0' 
standard
 // CHECK-NEXT: note: use 'clc++2021' for 'C++ for OpenCL 2021' standard
 

diff  --git a/clang/test/Preprocessor/predefined-macros.c 
b/clang/test/Preprocessor/predefined-macros.c
index ab85cfc00b42a..2dd4b78238a7b 100644
--- a/clang/test/Preprocessor/predefined-macros.c
+++ b/clang/test/Preprocessor/predefined-macros.c
@@ -145,6 +145,8 @@
 // RUN:   | FileCheck -match-full-lines %s --check-prefix=CHECK-CL20
 // RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-std=CL3.0 \
 // RUN:   | FileCheck -match-full-lines %s --check-prefix=CHECK-CL30
+// RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-std=CL3.1 \
+// RUN:   | FileCheck -match-full-lines %s --check-prefix=CHECK-CL31
 // RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-fast-relaxed-math \
 // RUN:   | FileCheck -match-full-lines %s --check-prefix=CHECK-FRM
 // RUN: %clang_cc1 %s -E -dM -o - -x cl -cl-std=clc++ \
@@ -158,6 +160,7 @@
 // CHECK-CL10: #define CL_VERSION_1_2 120
 // CHECK-CL10: #define CL_VERSION_2_0 200
 // CHECK-CL10: #define CL_VERSION_3_0 300
+// CHECK-CL10: #define CL_VERSION_3_1 310
 // CHECK-CL10: #define __OPENCL_C_VERSION__ 100
 // CHECK-CL10-NOT: #define __FAST_RELAXED_MATH__ 1
 // CHECK-CL11: #define CL_VERSION_1_0 100
@@ -165,6 +168,7 @@
 // CHECK-CL11: #define CL_VERSION_1_2 120
 // CHECK-CL11: #define CL_VERSION_2_0 200
 // CHECK-CL11: #define CL_VERSION_3_0 300
+// CHECK-CL11: #define CL_VERSION_3_1 310
 // CHECK-CL11: #define __OPENCL_C_VERSION__ 110
 // CHECK-CL11-NOT: #define __FAST_RELAXED_MATH__ 1
 // CHECK-CL12: #define CL_VERSION_1_0 100
@@ -172,6 +176,7 @@
 // CHECK-CL12: #define CL_VERSION_1_2 120
 // CHECK-CL12: #define CL_VERSION_2_0 200
 // CHECK-CL12: #define CL_VERSION_3_0 300
+// CHECK-CL12: #define CL_VERSION_3_1 310
 // CHECK-CL12: #define __OPENCL_C_VERSION__ 120
 // CHECK-CL12-NOT: #define __FAST_RELAXED_MATH__ 1
 // CHECK-CL20: #define CL_VERSION_1_0 100
@@ -179,6 +184,7 @@
 // CHECK-CL20: #define CL_VERSION_1_2 120
 // CHECK-CL20: #define CL_VERSION_2_0 200
 // CHECK-CL20: #define CL_VERSION_3_0 300
+// CHECK-CL20: #define CL_VERSION_3_1 310
 // CHECK-CL20: #define __OPENCL_C_VERSION__ 200
 // CHECK-CL20-NOT: #define __FAST_RELAXED_MATH__ 1
 // CHECK-CL30: #define CL_VERSION_1_0 100
@@ -186,8 +192,17 @@
 // CHECK-CL30: #define CL_VERSION_1_2 120
 // CHECK-CL30: #define CL_VERSION_2_0 200
 // CHECK-CL30: #define CL_VERSION_3_0 300
+// CHECK-CL30: #define CL_VERSION_3_1 310
 // CHECK-CL30: #define __OPENCL_C_VERSION__ 300
 // CHECK-CL30-NOT: #define __FAST_RELAXED_MATH__ 1
+// CHECK-CL31: #define CL_VERSION_1_0 100
+// CHECK-CL31: #define CL_VERSION_1_1 110
+// CHECK-CL31: #define CL_VERSION_1_2 120
+// CHECK-CL31: #define CL_VERSION_2_0 200
+// CHECK-CL31: #define CL_VERSION_3_0 300
+// CHECK-CL31: #define CL_VERSION_3_1 310
+// CHECK-CL31: #define __OPENCL_C_VERSION__ 310
+// CHECK-CL31-NOT: #define __FAST_RELAXED_MATH__ 1
 // CHECK-FRM: #define __FAST_RELAXED_MATH__ 1
 // CHECK-CLCPP10: #define __CL_CPP_VERSION_1_0__ 100
 // CHECK-CLCPP10: #define __CL_CPP_VERSION_2021__ 202100

diff  --git a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp 
b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
index 720afea8b0965..a666dd1ed795d 100644
--- a/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
+++ b/clang/utils/TableGen/ClangOpenCLBuiltinEmitter.cpp
@@ -604,7 +604,7 @@ static unsigned short EncodeVersions(unsigned int 
MinVersion,
     MaxVersion = UINT_MAX;
   }
 
-  unsigned VersionIDs[] = {100, 110, 120, 200, 300};
+  unsigned VersionIDs[] = {100, 110, 120, 200, 300, 310};
   for (unsigned I = 0; I < std::size(VersionIDs); I++) {
     if (VersionIDs[I] >= MinVersion && VersionIDs[I] < MaxVersion) {
       Encoded |= 1 << I;


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to