erichkeane added a comment.
Ok, Aaron and I are pretty confused here I think (based on offline
discussions), so I'm hoping for some guidance.
`ParseTemplateTemplateParameter` does all the work to parse a template-template
parameter, then calls `ActOnTemplateTemplateParameter`, which handles adding
the top-level name to the scope (as well as warning if the params list is 0).
Additionally, we noticed that:
`template<template<typename T> class C = std::enable_if_t<T::value>> struct
s{};`
Is illegal in all compilers, `T` is not available in the `enable_if_t` call.
This makes a lot of sense to me, since the `T` is essentially worthless: It can
never be matched, it never gets a concrete type, etc.
However, the test failure above does the equivilant of:
`template<template<typename T> requires T::value class C> struct s{};`
I note that MSVC and GCC accept this (no idea about EDG). However, this seems
worthless/useless for the same reason. I guess it somewhat makes sense that
the requires clause associated with the
template-template-parameter-parameter-list should have access to names from the
list, but they are still seemingly worthless to me.
My expectation is that I could implement this by introducing a new `Scope` that
contains all the names of the template-template-parameter-list and goes out of
scope as soon as we're done with the `requires` clause. It seems strange to do
so (and ends up having an `ActOnTemplateTemplateParameterParameterList` for
this purpose, plus some level of 'pop-scope'), but seems consistent with the
other compilers?
I guess what I'm saying is in addition to the other questions raised above
regarding whether these requires clauses are useful AT ALL, is that we likely
require guidance to finish implementing this paper
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D110641/new/
https://reviews.llvm.org/D110641
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits