Index: clang/docs/DiagnosticsReference.rst =================================================================== --- clang/docs/DiagnosticsReference.rst +++ clang/docs/DiagnosticsReference.rst @@ -10393,6 +10393,15 @@ +----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +-Wpedantic-redundant-pragma +------------------------ +**Diagnostic text:** + ++----------------------------------------------------------------------------------------------------------------------------------------------------------------+ +|:warning:`warning:` |nbsp| :diagtext:`OpenCL extension pragma` |nbsp| :placeholder:`A` |nbsp| :diagtext:`has no effect - ignoring`| ++----------------------------------------------------------------------------------------------------------------------------------------------------------------+ + + -Wpessimizing-move ------------------ **Diagnostic text:** Index: clang/include/clang/Basic/DiagnosticParseKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticParseKinds.td +++ clang/include/clang/Basic/DiagnosticParseKinds.td @@ -1231,7 +1231,9 @@ def warn_pragma_begin_end_mismatch : Warning< "OpenCL extension end directive mismatches begin directive - ignoring">, InGroup; def warn_pragma_unknown_extension : Warning< - "unknown OpenCL extension %0 - ignoring">, InGroup; + "unknown OpenCL extension pragma %0 - ignoring">, InGroup; +def warn_pragma_deprecated_extension : Warning< + "OpenCL extension pragma %0 has no effect - ignoring">, InGroup>, DefaultIgnore; def warn_pragma_unsupported_extension : Warning< "unsupported OpenCL extension %0 - ignoring">, InGroup; def warn_pragma_extension_is_core : Warning< Index: clang/lib/Parse/ParsePragma.cpp =================================================================== --- clang/lib/Parse/ParsePragma.cpp +++ clang/lib/Parse/ParsePragma.cpp @@ -786,9 +786,17 @@ if (Name != Actions.getCurrentOpenCLExtension()) PP.Diag(NameLoc, diag::warn_pragma_begin_end_mismatch); Actions.setCurrentOpenCLExtension(""); - } else if (!Opt.isKnown(Name)) - PP.Diag(NameLoc, diag::warn_pragma_unknown_extension) << Ident; - else if (Opt.isSupportedExtension(Name, getLangOpts())) + } else if (!Opt.isKnown(Name)) { + // The pragmas in this list do nothing but are kept mainly for backward + // compatibility. Pragmas from new extensions should not be added here. + // If the pragma does nothing it should not be added until its + // functionality is determined. + StringRef DeprecatedPragmas{"cl_khr_depth_images,"}; + if (DeprecatedPragmas.find(Name) != StringRef::npos) + PP.Diag(NameLoc, diag::warn_pragma_deprecated_extension) << Ident; + else + PP.Diag(NameLoc, diag::warn_pragma_unknown_extension) << Ident; + } else if (Opt.isSupportedExtension(Name, getLangOpts())) Opt.enable(Name, State == Enable); else if (Opt.isSupportedCore(Name, getLangOpts())) PP.Diag(NameLoc, diag::warn_pragma_extension_is_core) << Ident; Index: clang/test/Headers/opencl-c-header.cl =================================================================== --- clang/test/Headers/opencl-c-header.cl +++ clang/test/Headers/opencl-c-header.cl @@ -90,7 +90,7 @@ #if defined(__OPENCL_CPP_VERSION__) || (__OPENCL_C_VERSION__ >= CL_VERSION_1_2) // expected-no-diagnostics #else //__OPENCL_C_VERSION__ -// expected-warning@+2{{unknown OpenCL extension 'cl_intel_planar_yuv' - ignoring}} +// expected-warning@+2{{unknown OpenCL extension pragma 'cl_intel_planar_yuv' - ignoring}} #endif //__OPENCL_C_VERSION__ #pragma OPENCL EXTENSION cl_intel_planar_yuv : enable Index: clang/test/Parser/opencl-pragma.cl =================================================================== --- clang/test/Parser/opencl-pragma.cl +++ clang/test/Parser/opencl-pragma.cl @@ -2,7 +2,7 @@ #pragma OPENCL EXTENSION cl_khr_fp16 : enable -#pragma OPENCL EXTENSION cl_no_such_extension : disable /* expected-warning {{unknown OpenCL extension 'cl_no_such_extension' - ignoring}} */ +#pragma OPENCL EXTENSION cl_no_such_extension : disable /* expected-warning {{unknown OpenCL extension pragma 'cl_no_such_extension' - ignoring}} */ #pragma OPENCL EXTENSION all : disable #pragma OPENCL EXTENSION all : enable /* expected-warning {{expected 'disable' - ignoring}} */ Index: clang/test/SemaOpenCL/extension-begin.cl =================================================================== --- clang/test/SemaOpenCL/extension-begin.cl +++ clang/test/SemaOpenCL/extension-begin.cl @@ -18,8 +18,8 @@ #pragma OPENCL EXTENSION my_ext : enable #ifndef IMPLICIT_INCLUDE -// expected-warning@-2 {{unknown OpenCL extension 'my_ext' - ignoring}} -// expected-warning@+2 {{unknown OpenCL extension 'my_ext' - ignoring}} +// expected-warning@-2 {{unknown OpenCL extension pragma 'my_ext' - ignoring}} +// expected-warning@+2 {{unknown OpenCL extension pragma 'my_ext' - ignoring}} #endif // IMPLICIT_INCLUDE #pragma OPENCL EXTENSION my_ext : disable Index: clang/test/SemaOpenCL/extension-version.cl =================================================================== --- clang/test/SemaOpenCL/extension-version.cl +++ clang/test/SemaOpenCL/extension-version.cl @@ -7,7 +7,11 @@ // RUN: %clang_cc1 -x cl -cl-std=CL1.1 %s -verify -triple spir-unknown-unknown -Wpedantic-core-features -DTEST_CORE_FEATURES // RUN: %clang_cc1 -x cl -cl-std=CL1.2 %s -verify -triple spir-unknown-unknown -Wpedantic-core-features -DTEST_CORE_FEATURES // RUN: %clang_cc1 -x cl -cl-std=CL2.0 %s -verify -triple spir-unknown-unknown -Wpedantic-core-features -DTEST_CORE_FEATURES -// RUN: %clang_cc1 -x cl -cl-std=clc++ %s -verify -triple spir-unknown-unknown -Wpedantic-core-features -DTEST_CORE_FEATURES +// RUN: %clang_cc1 -x cl -cl-std=clc++ %s -verify -triple spir-unknown-unknown -Wpedantic-core-features -Wpedantic-redundant-pragma -DTEST_CORE_FEATURES -DTEST_REDUNDANT_PRAGMA + +#if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ == 200) && !(defined(TEST_CORE_FEATURES) || defined(TEST_REDUNDANT_PRAGMA)) +// expected-no-diagnostics +#endif // Extensions in all versions #ifndef __opencl_c_int64 @@ -167,14 +171,14 @@ #endif #pragma OPENCL EXTENSION cl_amd_media_ops2 : enable -// FIXME: This pragma is meaningless and it doesn't add any functionality. +// This pragma is meaningless and it doesn't add any functionality. // However we will probably need to keep it for backward compatibility. // In which case there is no need to guard its use by any version or a target // setting as it does absolutely nothing anyway. -// The warning diagnostic should change however to something like - -// - pragma has no effect. #pragma OPENCL EXTENSION cl_khr_depth_images : enable -// expected-warning@-1{{unknown OpenCL extension 'cl_khr_depth_images' - ignoring}} +#if defined(TEST_REDUNDANT_PRAGMA) +// expected-warning@-2{{OpenCL extension pragma 'cl_khr_depth_images' has no effect - ignoring}} +#endif #if (defined(__OPENCL_CPP_VERSION__) || __OPENCL_C_VERSION__ >= 120) #ifndef cl_intel_subgroups