[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