[clang] 6170072 - Improve modeling of variable template specializations with dependent
Martin Storsjö via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 11 02:09:25 PDT 2020
On Tue, 11 Aug 2020, Richard Smith wrote:
> On Tue, 11 Aug 2020 at 00:29, Martin Storsjö <martin at martin.st> wrote:
> On Sun, 9 Aug 2020, Richard Smith via cfe-commits wrote:
>
> >
> > Author: Richard Smith
> > Date: 2020-08-09T23:22:26-07:00
> > New Revision: 617007240cbfb97c8ccf6d61b0c4ca0bb62d43c9
> >
> > URL:https://github.com/llvm/llvm-project/commit/617007240cbfb97c8ccf6d61b0c4ca0
> bb62d43c9
> > DIFF:https://github.com/llvm/llvm-project/commit/617007240cbfb97c8ccf6d61b0c4ca0
> bb62d43c9.diff
> >
> > LOG: Improve modeling of variable template specializations
> with dependent
> > arguments.
> >
> > Don't build a variable template specialization declaration
> until its
> > scope and template arguments are non-dependent.
> >
> > No functionality change intended, but the AST representation
> is now more
> > consistent with how we model other templates.
>
> This did turn out to make a functional change, breaking building
> the dev
> branch of Qt. A halfway reduced example below:
>
>
> Thanks for reporting this! Reduced a bit more:
>
> template<class _Tp, class _Arg>
> inline constexpr bool is_nothrow_assignable_v = true;
>
> template<class T> class QCache {
> void replace() noexcept(is_nothrow_assignable_v<T>);
> };
>
> We used to allow this and now reject. This code is ill-formed (no diagnostic
> required) by [temp.res]/8, because it has no valid instantiations, because
> the second template argument of is_nothrow_assignable_v is missing.
>
> So, assuming the case from which this was reduced was similarly ill-formed
> (which it looks like itis: https://github.com/qt/qtbase/blob/48c8322a613f58d19ad9e0262bbac437ce259
> 8f8/src/corelib/tools/qcache.h#L114), I think that's a (minor) quality of
> implementation improvement -- we now diagnose a bug that we used to miss.
> ICC also rejects this, although GCC does not, and all three compilers reject
> the corresponding case using a class template instead of a variable
> template.
Thanks! I sent an attempt at a fix upstream at
https://codereview.qt-project.org/c/qt/qtbase/+/309878.
// Martin
More information about the cfe-commits
mailing list