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