Description
//Translation unit #1:
export module stuff;
export template<typename T, typename U> void foo(T, U u) { auto v = u; }
export template<typename T, typename U> void bar(T, U u) { auto v = *u; }
//Translation unit #2:
export module M1;
import "defn.h"; // provides struct X {};
import stuff;
export template<typename T> void f(T t) {
X x;
foo(t, x);
}
// Translation unit #3:
export module M2;
import "decl.h"; // provides struct X; (not a definition)
import stuff;
export template<typename T> void g(T t) {
X *x;
bar(t, x);
}
// Translation unit #4:
import M1;
import M2;
void test() {
f(0);
g(0);
}
For f(0)
, the comment says that
the instantiation context of foo<int, X> comprises
- the point at the end of translation unit
#1
,- the point at the end of translation unit
#2
, and- the point of the call to f(0),
For g(0), the comment says that
the instantiation context of bar<int, X> comprises
- the point at the end of translation unit
#1
,- the point at the end of translation unit
#3
, and- the point of the call to g(0),
For every first bullet, the point is specified by [module.context#3]
During the implicit instantiation of a template whose point of instantiation is specified as that of an enclosing specialization ([temp.point]), the instantiation context is the union of the instantiation context of the enclosing specialization and, if the template is defined in a module interface unit of a module M and the point of instantiation is not in a module interface unit of M, the point at the end of the declaration-seq of the primary module interface unit of M (prior to the private-module-fragment, if any).
However, it is confusing about the second bullet for either f(0)
or g(0)
. Which rule specifies that the end of TU2
is comprised by foo<int, X>
, the end of TU3
is comprised by bar<int, X>
? Specifically, is comprised by the enclosing specialization?
I think the emphasized wording just work for the template whose point of instantiation is specified as that of an enclosing specialization. In other words, [module.context] p3 should be parsed as that
During the implicit instantiation of a template T whose point of instantiation is specified as that of an enclosing specialization ([temp.point]), the instantiation context is the union of the instantiation context of the enclosing specialization and, if the template T is defined in a module interface unit of a module M and the point of instantiation is not in a module interface unit of M, the point at the end of the declaration-seq of the primary module interface unit of M (prior to the private-module-fragment, if any).
Except that the emphasized wording intends to work for the arbitrary template it is saying, it does not make sense the end of TU2
or TU3
is comprised.