Lazy template instantiation of unused reference arguments


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:

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 – 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.

Oh, wow, I learn every day.

Thank you for the pointer.