Author: Anastasia Stulova Date: 2021-05-11T12:54:38+01:00 New Revision: 13ea238b1e1db96ef5fd409e869d9a8ebeef1332
URL: https://github.com/llvm/llvm-project/commit/13ea238b1e1db96ef5fd409e869d9a8ebeef1332 DIFF: https://github.com/llvm/llvm-project/commit/13ea238b1e1db96ef5fd409e869d9a8ebeef1332.diff LOG: [OpenCL] Allow use of double type without extension pragma. Simply use of extensions by allowing the use of supported double types without the pragma. Since earlier standards instructed that the pragma is used explicitly a new warning is introduced in pedantic mode to indicate that use of type without extension pragma enable can be non-portable. This patch does not break backward compatibility since the extension pragma is still supported and it makes the behavior of the compiler less strict by accepting code without extra pragma statements. Differential Revision: https://reviews.llvm.org/D100980 Added: Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/Sema.cpp clang/lib/Sema/SemaType.cpp clang/test/Misc/warning-flags.c clang/test/SemaOpenCL/extensions.cl Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index f78940a6e6fad..3d665cc76c539 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -10023,6 +10023,9 @@ def err_opencl_variadic_function : Error< "invalid prototype, variadic arguments are not allowed in OpenCL">; def err_opencl_requires_extension : Error< "use of %select{type|declaration}0 %1 requires %2 support">; +def ext_opencl_double_without_pragma : Extension< + "Clang permits use of type 'double' regardless pragma if 'cl_khr_fp64' is" + " supported">; def warn_opencl_generic_address_space_arg : Warning< "passing non-generic address space pointer to %0" " may cause dynamic conversion affecting performance">, diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 6c78d7325d681..b23140b4589c3 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -366,7 +366,6 @@ void Sema::Initialize() { "cl_khr_int64_base_atomics cl_khr_int64_extended_atomics"); } - setOpenCLExtensionForType(Context.DoubleTy, "cl_khr_fp64"); #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ if (getOpenCLOptions().isSupported(#Ext, getLangOpts())) { \ diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index e3f8b747a783b..9801dd6ffb66e 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1524,6 +1524,13 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { break; case DeclSpec::TST_float: Result = Context.FloatTy; break; case DeclSpec::TST_double: + if (S.getLangOpts().OpenCL) { + if (!S.getOpenCLOptions().isSupported("cl_khr_fp64", S.getLangOpts())) + S.Diag(DS.getTypeSpecTypeLoc(), diag::err_opencl_requires_extension) + << 0 << Context.DoubleTy << "cl_khr_fp64"; + else if (!S.getOpenCLOptions().isAvailableOption("cl_khr_fp64", S.getLangOpts())) + S.Diag(DS.getTypeSpecTypeLoc(), diag::ext_opencl_double_without_pragma); + } if (DS.getTypeSpecWidth() == TypeSpecifierWidth::Long) Result = Context.LongDoubleTy; else diff --git a/clang/test/Misc/warning-flags.c b/clang/test/Misc/warning-flags.c index 54e36e1e08845..e4f9069b88c86 100644 --- a/clang/test/Misc/warning-flags.c +++ b/clang/test/Misc/warning-flags.c @@ -91,4 +91,4 @@ CHECK-NEXT: warn_weak_import The list of warnings in -Wpedantic should NEVER grow. -CHECK: Number in -Wpedantic (not covered by other -W flags): 26 +CHECK: Number in -Wpedantic (not covered by other -W flags): 27 diff --git a/clang/test/SemaOpenCL/extensions.cl b/clang/test/SemaOpenCL/extensions.cl index b0be017511a80..97380292dcae6 100644 --- a/clang/test/SemaOpenCL/extensions.cl +++ b/clang/test/SemaOpenCL/extensions.cl @@ -1,5 +1,6 @@ // RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -pedantic -fsyntax-only // RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -pedantic -fsyntax-only -cl-std=CL1.1 +// RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -fsyntax-only -cl-std=CL1.1 -DNOPEDANTIC // RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -pedantic -fsyntax-only -cl-std=CL1.2 -DFP64 // Test with a target not supporting fp64. @@ -43,8 +44,20 @@ #endif #if (defined(__OPENCL_C_VERSION__) && __OPENCL_C_VERSION__ < 120) -void f1(double da) { // expected-error {{type 'double' requires cl_khr_fp64 support}} - double d; // expected-error {{type 'double' requires cl_khr_fp64 support}} +void f1(double da) { +#ifdef NOFP64 +// expected-error@-2 {{type 'double' requires cl_khr_fp64 support}} +#elif !defined(NOPEDANTIC) +// expected-warning@-4{{Clang permits use of type 'double' regardless pragma if 'cl_khr_fp64' is supported}} +#endif + double d; +#ifdef NOFP64 +// expected-error@-2 {{type 'double' requires cl_khr_fp64 support}} +#elif !defined(NOPEDANTIC) +// expected-warning@-4{{Clang permits use of type 'double' regardless pragma if 'cl_khr_fp64' is supported}} +#endif + // FIXME: this diagnostic depends on the extension pragma in the earlier versions. + // There is no indication that this behavior is expected. (void) 1.0; // expected-warning {{double precision constant requires cl_khr_fp64}} } #endif @@ -79,13 +92,11 @@ void f2(void) { double4 d4 = {0.0f, 2.0f, 3.0f, 1.0f}; #ifdef NOFP64 // expected-error@-3 {{use of type 'double' requires cl_khr_fp64 support}} -// expected-error@-3 {{use of type 'double4' (vector of 4 'double' values) requires cl_khr_fp64 support}} #endif (void) 1.0; - #ifdef NOFP64 -// expected-warning@-3{{double precision constant requires cl_khr_fp64, casting to single precision}} +// expected-warning@-2{{double precision constant requires cl_khr_fp64, casting to single precision}} #endif } @@ -96,6 +107,11 @@ void f2(void) { #if (defined(__OPENCL_C_VERSION__) && __OPENCL_C_VERSION__ < 120) void f3(void) { - double d; // expected-error {{type 'double' requires cl_khr_fp64 support}} + double d; +#ifdef NOFP64 +// expected-error@-2 {{type 'double' requires cl_khr_fp64 support}} +#elif !defined(NOPEDANTIC) +// expected-warning@-4 {{Clang permits use of type 'double' regardless pragma if 'cl_khr_fp64' is supported}} +#endif } #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits