[PATCH] D62584: [OpenCL][PR42033] Deducing addr space with template parameter types

John McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 9 23:05:01 PDT 2019


rjmccall added inline comments.


================
Comment at: lib/Sema/TreeTransform.h:5363
+    if (ResultType.getAddressSpace() != LangAS::Default &&
+        (ResultType.getAddressSpace() != LangAS::opencl_private)) {
       SemaRef.Diag(TL.getReturnLoc().getBeginLoc(),
----------------
Anastasia wrote:
> Anastasia wrote:
> > rjmccall wrote:
> > > Anastasia wrote:
> > > > I am trying to be a bit more helpful here although I am not sure if we should instead require explicit template parameter and fail the template deduction instead.
> > > > 
> > > > Basically, do we want the following code to always require specifying template argument explicitly:
> > > > 
> > > > 
> > > > ```
> > > > template <class T>
> > > > T xxx(T *in) {
> > > >   T *i = in;
> > > >   return *i;
> > > > }
> > > > 
> > > > __kernel void test() {
> > > >   int foo[10];
> > > >   xxx<int>(&foo[0]); // if we deduce type from foo, it ends up being qualified by __private that we currently diagnose. However private is default (implicit) address space for return type so technically there is no danger in just allowing xxx(&foo[0])
> > > > }
> > > > ```
> > > Implicitly ignoring all address-space qualifiers on the return type seems like the right thing to do; I don't think it needs to be limited to `__private`.  That's probably also the right thing to do for locals, but I'm less certain about it.
> > Just to clarify by "Implicitly ignoring" you mean ignoring if the templ parameters were deduced?
> > 
> > Although I am a bit concerned about allowing other than `__private` address spaces in return types as we reject them in return types of functions generally. Would it not be somehow inconsistent?
> Ok, I have removed the diagnostic completely. At least we don't seem to generate any incorrect IR.
They should be diagnosed somehow when written explicitly on a return type, but if you just do that on the parser path you don't have to worry about it during template instantiation.  They should probably otherwise be ignored no matter where they came from — if someone typedefs `private_int_t` to `__private int`, you should just treat that as `int` in a return type.  Stripping the qualifier from the type is probably the right thing to do so that it doesn't further impact semantic analysis.

I definitely don't think you want a model where the qualifier actually means that the return is somehow done via an object in that address space.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62584/new/

https://reviews.llvm.org/D62584





More information about the cfe-commits mailing list