[PATCH] D79800: [Sema] Remove default values for arguments prior to a parameter pack if the pack is used

Arthur O'Dwyer via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri May 22 00:37:29 PDT 2020


Quuxplusone added inline comments.


================
Comment at: clang/test/CXX/drs/dr7xx.cpp:225
 template <typename... T>
 void f(int i = 0, T ...args) {}
 void ff() { f(); }
----------------
rjmccall wrote:
> Quuxplusone wrote:
> > Is this even supposed to compile? The only valid specializations of `f` require `T...` to be an empty pack, which violates [temp.res/8.3](https://timsong-cpp.github.io/cppwp/temp.res#8.3).
> > 
> > The comment mentions [DR777](http://cwg-issue-browser.herokuapp.com/cwg777), but DR777 doesn't explain the circumstances under which its wording change matters. It //seems// only to apply to templates that are already ill-formed by temp.res/8.3.
> Yeah, Richard made this point in [[http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2233|DR2233]], and the wording was weakened to allow it, in a way that essentially makes the earlier default arguments dead.
Huh. Ick. Indeed the other vendors seem to be implementing DR777/DR2233, so I guess Clang ought to catch up even if it's a silly direction to go in. :( I do see a small bit of implementation divergence in https://godbolt.org/z/ZMCvAX —
```
template<class... Ts>
int f(int i=1, Ts... ts) { return (i + ... + ts); }

template<>
int f<int>(int i, int j) { return 42; }
```
GCC rejects as ill-formed. MSVC makes the specialization callable with 2 arguments only. EDG (ICC) makes the specialization callable with 0 or 2 arguments (and does [crazy things](https://godbolt.org/z/QTrVeh) when you call it with 0 arguments).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D79800





More information about the cfe-commits mailing list