fhahn added inline comments.

================
Comment at: clang/lib/Sema/SemaTemplateDeduction.cpp:2112
+          llvm::APSInt ArgRows(S.Context.getTypeSize(S.Context.IntTy),
+                               ConstantMatrixArg->getNumRows());
+          Result = DeduceNonTypeTemplateArgument(
----------------
rjmccall wrote:
> fhahn wrote:
> > rjmccall wrote:
> > > Oh, and this needs to use `size_t`; not just the value but the type of a 
> > > non-type template parameter can be deduced, so you should use an 
> > > appropriate type.  Test case for this deduction is `template <auto R> 
> > > void foo(matrix<int, R, 10>);` or something like that, with a check that 
> > > `decltype(R)` is `size_t` (which you can do in any number of ways).
> > Could we be even more permissive? If we fix it to size_t, template 
> > arguments with integer types like int or unsigned would be rejected.  Could 
> > we relax that to NTTP type, to allow different integer types that are 
> > implicitly convertible? We might need an extra check that the known number 
> > of rows/columns does not exceed the bit width of NTTP's type.
> Unfortunately, template argument deduction requires the template parameter 
> type to match the type of the argument value exactly, so you get exactly one 
> type.  Given that language rule, the natural type to use is `size_t`, which 
> is the same type that constant array bounds are considered to have.   If C++ 
> wants to weaken this language rule, they should do so uniformly; it does not 
> make sense for us to use a weaker rule just for this specific extension.
Thanks for the explanation! I've updated the code to just allow size_t.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D72281



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

Reply via email to