rjmccall added a comment.

In D56411#1369906 <https://reviews.llvm.org/D56411#1369906>, @yaxunl wrote:

> In D56411#1365745 <https://reviews.llvm.org/D56411#1365745>, @rjmccall wrote:
>
> > In D56411#1365727 <https://reviews.llvm.org/D56411#1365727>, @yaxunl wrote:
> >
> > > In D56411#1360010 <https://reviews.llvm.org/D56411#1360010>, @rjmccall 
> > > wrote:
> > >
> > > > I think the diagnostic should come during instantiation when you find 
> > > > an evaluated use of a host function within a device function.
> > >
> > >
> > > It seems the body of function template is checked only during parsing of 
> > > the definition of the template itself. When a function
> > >  template is instantiated, the body of the instantiated function is not 
> > > checked again.
> >
> >
> > No, that's not correct.  However, it's checked somewhat differently, and 
> > it's possible that the existing diagnostic is not set up to fire along all 
> > common paths.  Try moving the diagnostic to `MarkFunctionReferenced`, and 
> > note that `OdrUse` will be `false` in all the unevaluated contexts.
>
>
> I got regression in the folowing test when checking CheckCUDACall in 
> MarkFunctionReferenced:
>
>   typedef struct {
>     template <unsigned n> void *foo() { return 0; }
>   
>     void foo() {
>       foo<0>();
>     }
>   } A;
>   
>   
>
> Basically clang does not allow getting linkage of foo<0> before 
> ActOnTypedefDeclarator, quoting SemaDecl.cpp line 4171
>
>   // If we've already computed linkage for the anonymous tag, then
>   // adding a typedef name for the anonymous decl can change that
>   // linkage, which might be a serious problem.  Diagnose this as
>   // unsupported and ignore the typedef name.  TODO: we should
>   // pursue this as a language defect and establish a formal rule
>   // for how to handle it.
>   if (TagFromDeclSpec->hasLinkageBeenComputed()) {
>     Diag(NewTD->getLocation(), diag::err_typedef_changes_linkage);
>   
>   
>
> However, CheckCUDACall needs to call GetGVALinkageForFunction on the callee 
> to know if it will be emitted,
>  which causes the linkage of the anonymous struct to be cached and triggers 
> err_typedef_changes_linkage.


Sounds like you were missing a case in the diagnostic, then.

Can you check whether you're in an `inline` function before you check the 
linkage?  It's a bit of a hack but it might work.  You have logic to look for 
evaluated references in used inline functions anyway, right?


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

https://reviews.llvm.org/D56411



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

Reply via email to