You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
//Translation unit #1:export module stuff;
exporttemplate<typename T, typename U> voidfoo(T, U u) { auto v = u; }
exporttemplate<typename T, typename U> voidbar(T, U u) { auto v = *u; }
//Translation unit #2:export module M1;
import "defn.h"; // provides struct X {};
import stuff;
exporttemplate<typename T> voidf(T t) {
X x;
foo(t, x);
}
// Translation unit #3:export module M2;
import "decl.h"; // provides struct X; (not a definition)
import stuff;
exporttemplate<typename T> voidg(T t) {
X *x;
bar(t, x);
}
// Translation unit #4:
import M1;
import M2;
voidtest() {
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.
The text was updated successfully, but these errors were encountered:
@jensmaurer Could you please take a look at this? It seems to make no sense the TU2 or TU3 is a point in an instantiation context as per the current wording.
For
f(0)
, the comment says thatFor g(0), the comment says that
For every first bullet, the point is specified by [module.context#3]
However, it is confusing about the second bullet for either
f(0)
org(0)
. Which rule specifies that the end ofTU2
is comprised byfoo<int, X>
, the end ofTU3
is comprised bybar<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
Except that the emphasized wording intends to work for the arbitrary template it is saying, it does not make sense the end of
TU2
orTU3
is comprised.The text was updated successfully, but these errors were encountered: