Anastasia added a comment.


In https://reviews.llvm.org/D28136#697844, @bader wrote:

> > Why do you think this is a bug? It seems to follow standard behavior in C 
> > to promote char to int if required. Just like if you would have a C code:
> > 
> >   int as_int(int i);
> >   void foo() {
> >       char src = 1;
> >       int dst = as_int(src);
> >   } 
> >    
> > 
> > This code would complie and the same exactly IR would be generated.
>
> as_type is defined to be used for bit re-interpretation. (see 6.2.4.2 
> Reinterpreting Types Using as_type() and as_typen()). In this sense, it's 
> exactly matches __bultin_astype built-in function.
>
> Here are a few relevant OpenCL C language specification quotes from 6.2.4 
> section:
>
> > All data types described in tables 6.1 and 6.2 (except bool, half and void) 
> > may be also reinterpreted as another data type of **the same size** using 
> > the as_type() operator for scalar data types and the as_typen() operator 
> > for vector data types.
>
>
>
> > The usual type promotion for function arguments shall not be performed.
>
>
>
> > It is an error to use as_type() or as_typen() operator to reinterpret data 
> > to a type of a different number of bytes.
>
> So, aliasing as_type to __builtin_astype provides these checks, whereas we 
> can't do it for overloadable as_type function declarations.
>
> I also would like to address your original concerns:
>
> > The main issue is after preprocessing the header the original function name 
> > is no longer available in diagnostics reported.
>
> Actually diagnostics is able to provide a hint to exact code location in the 
> header file where as_<type> is defined as macro, so user gets correct name of 
> the operator in diagnostics as far as I know.
>
> > The spec defines as_type as a builtin function and not a macro.
>
> To be precise, spec defines as_type as an operator. So, the best way to 
> implement it would be to add a language support of such operator, but AFAIK 
> aliasing to __bulitin_astype via macro is sufficient enough for OpenCL use 
> cases.
>
> > Additionally your patch would allow as_type to be used with extra type (not 
> > only those defined in spec).
>
> Not sure I get this. We defined limited set of as_* functions - only for 
> types from tables 6.1 and 6.2 as specified by specification, so if OpenCL 
> developer will try to call as_<type1>(type2), which is not defined in the 
> header, compiler will report en error about calling undeclared function.
>
> > Also I don't see the problem to implement as_type with just simply calling 
> > a builtin. It should be inlined later anyways.
>
> Yes, but this solution will not give us error checking as pre-processor 
> solution.
>
> Does it make sense?


From all the above arguments, I feel like the right approach would be to 
implement it as Clang builtin which closely matches the operator semantic in my 
opinion. We could of course reuse the implementation of  __bultin_astype to 
avoid unnecessary extra work and code duplication.

Using the macro seems to me more like a workaround solution and overloaded 
functions don't seem to be entirely the right thing either.  What do you think 
about it?


https://reviews.llvm.org/D28136



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to