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

Reply via email to