[module.context] instantiation context of the enclosing specialization
Nobody has claimed this yet.
- Dominant language
- TeX
- Stars
- 221
- Forks
- 813
- Avg merge
- 16h 4m
- Merged PRs (30d)
- 36
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.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with [module.context] p3 and [temp.point], then trace the four translation-unit example and the stated instantiation contexts for f(0) and g(0). Done means resolving whether the second bullet follows from the enclosing specialization and, if needed, recording a settled wording or interpretation in this issue.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- cpp
- Domain
- documentation
- Issue type
- Documentation
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100