Index: clang/lib/Headers/opencl-c-base.h =================================================================== --- clang/lib/Headers/opencl-c-base.h +++ clang/lib/Headers/opencl-c-base.h @@ -74,6 +74,25 @@ #define __opencl_c_atomic_scope_all_devices 1 #define __opencl_c_read_write_images 1 #endif // defined(__SPIR__) + +// Undefine any feature macros that have been explicitly disabled using +// an __undef_ macro. +#ifdef __undef___opencl_c_work_group_collective_functions +#undef __opencl_c_work_group_collective_functions +#endif +#ifdef __undef___opencl_c_atomic_order_seq_cst +#undef __opencl_c_atomic_order_seq_cst +#endif +#ifdef __undef___opencl_c_atomic_scope_device +#undef __opencl_c_atomic_scope_device +#endif +#ifdef __undef___opencl_c_atomic_scope_all_devices +#undef __opencl_c_atomic_scope_all_devices +#endif +#ifdef __undef___opencl_c_read_write_images +#undef __opencl_c_read_write_images +#endif + #endif // (__OPENCL_CPP_VERSION__ == 202100 || __OPENCL_C_VERSION__ == 300) #if !defined(__opencl_c_generic_address_space) Index: clang/test/SemaOpenCL/features.cl =================================================================== --- clang/test/SemaOpenCL/features.cl +++ clang/test/SemaOpenCL/features.cl @@ -26,6 +26,15 @@ // RUN: %clang_cc1 -triple spir-unknown-unknown %s -E -dM -o - -x cl -cl-std=clc++1.0 \ // RUN: | FileCheck -match-full-lines %s --check-prefix=NO-FEATURES +// For OpenCL C 3.0, header-only features can be disabled using macros. +// RUN: %clang_cc1 -triple spir-unknown-unknown %s -E -dM -o - -x cl -cl-std=CL3.0 -fdeclare-opencl-builtins -finclude-default-header \ +// RUN: -D__undef___opencl_c_work_group_collective_functions=1 \ +// RUN: -D__undef___opencl_c_atomic_order_seq_cst=1 \ +// RUN: -D__undef___opencl_c_atomic_scope_device=1 \ +// RUN: -D__undef___opencl_c_atomic_scope_all_devices=1 \ +// RUN: -D__undef___opencl_c_read_write_images=1 \ +// RUN: | FileCheck %s --check-prefix=NO-HEADERONLY-FEATURES + // Note that __opencl_c_int64 is always defined assuming // always compiling for FULL OpenCL profile @@ -43,14 +52,20 @@ // FEATURES: #define __opencl_c_subgroups 1 // NO-FEATURES: #define __opencl_c_int64 1 -// NO-FEATURES-NOT: __opencl_c_3d_image_writes -// NO-FEATURES-NOT: __opencl_c_atomic_order_acq_rel -// NO-FEATURES-NOT: __opencl_c_atomic_order_seq_cst -// NO-FEATURES-NOT: __opencl_c_device_enqueue -// NO-FEATURES-NOT: __opencl_c_fp64 -// NO-FEATURES-NOT: __opencl_c_generic_address_space -// NO-FEATURES-NOT: __opencl_c_images -// NO-FEATURES-NOT: __opencl_c_pipes -// NO-FEATURES-NOT: __opencl_c_program_scope_global_variables -// NO-FEATURES-NOT: __opencl_c_read_write_images -// NO-FEATURES-NOT: __opencl_c_subgroups +// NO-FEATURES-NOT: #define __opencl_c_3d_image_writes +// NO-FEATURES-NOT: #define __opencl_c_atomic_order_acq_rel +// NO-FEATURES-NOT: #define __opencl_c_atomic_order_seq_cst +// NO-FEATURES-NOT: #define __opencl_c_device_enqueue +// NO-FEATURES-NOT: #define __opencl_c_fp64 +// NO-FEATURES-NOT: #define __opencl_c_generic_address_space +// NO-FEATURES-NOT: #define __opencl_c_images +// NO-FEATURES-NOT: #define __opencl_c_pipes +// NO-FEATURES-NOT: #define __opencl_c_program_scope_global_variables +// NO-FEATURES-NOT: #define __opencl_c_read_write_images +// NO-FEATURES-NOT: #define __opencl_c_subgroups + +// NO-HEADERONLY-FEATURES-NOT: #define __opencl_c_work_group_collective_functions +// NO-HEADERONLY-FEATURES-NOT: #define __opencl_c_atomic_order_seq_cst +// NO-HEADERONLY-FEATURES-NOT: #define __opencl_c_atomic_scope_device +// NO-HEADERONLY-FEATURES-NOT: #define __opencl_c_atomic_scope_all_devices +// NO-HEADERONLY-FEATURES-NOT: #define __opencl_c_read_write_images