rsmith added inline comments.

================
Comment at: clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:31
 IP<&tl> ip7; // expected-error{{non-type template argument of type 'int *' is 
not a constant expression}}
+IP<(int*)1> ip8; // expected-error {{non-type template argument does not refer 
to any declaration}}
 
----------------
erichkeane wrote:
> shafik wrote:
> > shafik wrote:
> > > It looks like in C++17 mode we catch this case: 
> > > https://godbolt.org/z/s43oE5qWE
> > Another case to check for:
> > 
> > ```
> > IP<(int*)(1-1)> ip9;
> > ```
> > 
> > In C++11 the wording use to allow `integer constant expressions`
> The new diagnostic here is unfortunate.  That 'does not refer to any 
> declaration' doesn't really let me know that it is illegal because that isn't 
> a NPE.  
> 
> The 'treat it as a null ptr' here is obviously awful, but I find myself 
> wondering if we can do better on this diagnostic trivially enough?
> It looks like in C++17 mode we catch this case: 
> https://godbolt.org/z/s43oE5qWE

That's diagnosing the cast, not the template argument value. You can get around 
the cast diagnostic by forcing constant folding with a `__builtin_constant_p` 
conditional ([example](https://godbolt.org/z/8f8WWTGeM)). Then we diagnose as
> <source>:7:4: error: non-type template argument refers to subobject '(int *)1'
... which seems like a worse diagnostic than the C++11 one, because it's not 
even true.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D134928

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

Reply via email to