[cfe-dev] Lazy template instantiation of unused reference arguments

Richard Smith via cfe-dev cfe-dev at lists.llvm.org
Wed Feb 19 18:26:05 PST 2020


On Wed, 19 Feb 2020 at 17:56, Alexandre Isoard via cfe-dev <
cfe-dev at lists.llvm.org> wrote:

> Hi,
>
> I'm having some issue with "opaque struct" being instantiated by Clang on
> unused reference arguments that have template types (that's an annoyance
> but not the topic of this email). I assume Clang decide to be lazy on the
> instantiation of unused arguments to save compile time.
>
> But now I am wondering if that is actually a legal behavior in C++.
> For example, the following code does not trigger the static_assert:
>
> template<int N>
> struct test {
> static_assert(N == 42);
> };
>
> int foo(test<69> &a) {
> return 0;
> }
>
> Is that expected/desired behavior? (if you add "a = a;" then it will
> properly trigger it)
>

The C++ language rules do not permit instantiation of test<69> in this
program. See http://eel.is/c++draft/temp.inst#1.sentence-1 -- this program
does not require test<69> to be a complete type, and its definition doesn't
affect the semantics of the program, so instantiation of that class is
neither required nor permitted here.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20200219/cebb4a90/attachment-0001.html>


More information about the cfe-dev mailing list