Hi Anastasia,

Richard and I discussed the way to enforce the error w/o customizing
the diagnostic for OpenCL off-list and Richard proposed to use
"-Werror=implicit-function-declaration" command line option if error
is required. Will it work for you?

Thanks,
Alexey
On Tue, Aug 21, 2018 at 5:41 PM Anastasia Stulova via cfe-commits
<cfe-commits@lists.llvm.org> wrote:
>
> If there are no objections I would like to revert this old commit that 
> coverts error about implicit function declaration into a warning.
>
>
> We have decided to generate an error for this https://reviews.llvm.org/D31745 
> because for OpenCL variadic prototypes are disallowed (section 6.9.e, 
> https://www.khronos.org/registry/OpenCL/specs/opencl-2.0-openclc.pdf) and the 
> implicit prototype requires variadic support. As most vendors that support 
> OpenCL don't support variadic functions it was decided to restrict this 
> explicitly in the spec (section s6.9.u). There is a little bit of more 
> history in https://reviews.llvm.org/D17438.
>
> Currently the code that can't run correctly on most OpenCL targets compiles 
> successfully. The problem can't be easily seen by the OpenCL developers since 
> it's not very common to retrieve the compilation warning log during online 
> compilation. Also generated IR doesn't seem to be correct if I compare with 
> the similar code in C.
>
> Example:
>  1 typedef long long16 __attribute__((ext_vector_type(16)));
>  2 void test_somefunc( __global int *d, __global void *s )
>  3 {
>  4   int i = get_global_id(0);
>  5   d[i] = somefunc((( __global long16 *)s)[i]);
>  6 }
>
> Is generated to:
>
> %call1 = call i32 (<16 x i64>*, ...) bitcast (i32 ()* @somefunc to i32 (<16 x 
> i64>*, ...)*)(<16 x i64>* byval nonnull align 128 %indirect-arg-temp) #2
> ...
>
> declare i32 @somefunc() local_unnamed_addr #1
>
> Equivalent C code at least generates variadic function prototype correctly:
>
> %call1 = call i32 (<16 x i64>*, ...) bitcast (i32 (...)* @somefunc to i32 
> (<16 x i64>*, ...)*)(<16 x i64>* byval align 128 %indirect-arg-temp)
> ...
> declare i32 @somefunc(...)
>
> Anastasia
> ________________________________
> From: cfe-commits <cfe-commits-boun...@lists.llvm.org> on behalf of Richard 
> Smith via cfe-commits <cfe-commits@lists.llvm.org>
> Sent: 04 October 2017 02:58
> To: cfe-commits@lists.llvm.org
> Subject: r314872 - We allow implicit function declarations as an extension in 
> all C dialects. Remove OpenCL special case.
>
> Author: rsmith
> Date: Tue Oct  3 18:58:22 2017
> New Revision: 314872
>
> URL: http://llvm.org/viewvc/llvm-project?rev=314872&view=rev
> Log:
> We allow implicit function declarations as an extension in all C dialects. 
> Remove OpenCL special case.
>
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/lib/Sema/SemaDecl.cpp
>     cfe/trunk/test/SemaOpenCL/clang-builtin-version.cl
>     cfe/trunk/test/SemaOpenCL/to_addr_builtin.cl
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=314872&r1=314871&r2=314872&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Oct  3 18:58:22 
> 2017
> @@ -355,7 +355,7 @@ def warn_implicit_function_decl : Warnin
>    "implicit declaration of function %0">,
>    InGroup<ImplicitFunctionDeclare>, DefaultIgnore;
>  def ext_implicit_function_decl : ExtWarn<
> -  "implicit declaration of function %0 is invalid in C99">,
> +  "implicit declaration of function %0 is invalid in %select{C99|OpenCL}1">,
>    InGroup<ImplicitFunctionDeclare>;
>  def note_function_suggestion : Note<"did you mean %0?">;
>
> @@ -8449,8 +8449,6 @@ def err_opencl_scalar_type_rank_greater_
>      "element. (%0 and %1)">;
>  def err_bad_kernel_param_type : Error<
>    "%0 cannot be used as the type of a kernel parameter">;
> -def err_opencl_implicit_function_decl : Error<
> -  "implicit declaration of function %0 is invalid in OpenCL">;
>  def err_record_with_pointers_kernel_param : Error<
>    "%select{struct|union}0 kernel parameters may not contain pointers">;
>  def note_within_field_of_type : Note<
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=314872&r1=314871&r2=314872&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Oct  3 18:58:22 2017
> @@ -12642,17 +12642,15 @@ NamedDecl *Sema::ImplicitlyDefineFunctio
>    }
>
>    // Extension in C99.  Legal in C90, but warn about it.
> +  // OpenCL v2.0 s6.9.u - Implicit function declaration is not supported.
>    unsigned diag_id;
>    if (II.getName().startswith("__builtin_"))
>      diag_id = diag::warn_builtin_unknown;
> -  // OpenCL v2.0 s6.9.u - Implicit function declaration is not supported.
> -  else if (getLangOpts().OpenCL)
> -    diag_id = diag::err_opencl_implicit_function_decl;
> -  else if (getLangOpts().C99)
> +  else if (getLangOpts().C99 || getLangOpts().OpenCL)
>      diag_id = diag::ext_implicit_function_decl;
>    else
>      diag_id = diag::warn_implicit_function_decl;
> -  Diag(Loc, diag_id) << &II;
> +  Diag(Loc, diag_id) << &II << getLangOpts().OpenCL;
>
>    // If we found a prior declaration of this function, don't bother building
>    // another one. We've already pushed that one into scope, so there's 
> nothing
>
> Modified: cfe/trunk/test/SemaOpenCL/clang-builtin-version.cl
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/clang-builtin-version.cl?rev=314872&r1=314871&r2=314872&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaOpenCL/clang-builtin-version.cl (original)
> +++ cfe/trunk/test/SemaOpenCL/clang-builtin-version.cl Tue Oct  3 18:58:22 
> 2017
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 %s -fblocks -verify -pedantic -fsyntax-only -ferror-limit 
> 100
> +// RUN: %clang_cc1 %s -fblocks -verify -pedantic-errors -fsyntax-only 
> -ferror-limit 100
>
>  // Confirm CL2.0 Clang builtins are not available in earlier versions
>
>
> Modified: cfe/trunk/test/SemaOpenCL/to_addr_builtin.cl
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/to_addr_builtin.cl?rev=314872&r1=314871&r2=314872&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaOpenCL/to_addr_builtin.cl (original)
> +++ cfe/trunk/test/SemaOpenCL/to_addr_builtin.cl Tue Oct  3 18:58:22 2017
> @@ -10,7 +10,7 @@ void test(void) {
>
>    glob = to_global(glob, loc);
>  #if __OPENCL_C_VERSION__ < CL_VERSION_2_0
> -  // expected-error@-2{{implicit declaration of function 'to_global' is 
> invalid in OpenCL}}
> +  // expected-warning@-2{{implicit declaration of function 'to_global' is 
> invalid in OpenCL}}
>    // expected-warning@-3{{incompatible integer to pointer conversion 
> assigning to '__global int *' from 'int'}}
>  #else
>    // expected-error@-5{{invalid number of arguments to function: 
> 'to_global'}}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> _______________________________________________
> cfe-commits mailing list
> cfe-commits@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to