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

Alexandre Isoard via cfe-dev cfe-dev at lists.llvm.org
Thu Feb 20 08:03:24 PST 2020


Oh, wow, I learn every day.

Thank you for the pointer.

On Wed, Feb 19, 2020, 18:26 Richard Smith <richard at metafoo.co.uk> wrote:

> 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/20200220/51dec394/attachment.html>


More information about the cfe-dev mailing list