================
@@ -1104,9 +1104,13 @@ void Sema::ActOnStartOfTranslationUnit() {
 }
 
 void Sema::ActOnEndOfTranslationUnitFragment(TUFragmentKind Kind) {
-  // No explicit actions are required at the end of the global module fragment.
-  if (Kind == TUFragmentKind::Global)
+  if (Kind == TUFragmentKind::Global) {
+    // Perform Pending Instantiations at the end of global module fragment so
+    // that the module ownership of TU-level decls won't get messed.
+    llvm::TimeTraceScope TimeScope("PerformPendingInstantiations");
+    PerformPendingInstantiations();
----------------
ChuanqiXu9 wrote:

I feel it is less concerning to me.

> If a template has been instantiated, we don't need to instantiate it again.

It is already the case. When we want to instantiate a template instantiation, 
we will lookup if we've already instantiated it. And when we lookup if we 
instantiated an instantiation, we will lookup it in the external source. See 
`findSpecializationImpl` in DeclTemplate.cpp for details.

> The instantiations should either have no ownership, perhaps homed to the 
> owner of the pattern, or maybe be multiply owned.

On the other hand, if we don't find an instantiation in the external source, we 
will instantiate it. Then the **same**(?) instantiation may be instantiated to 
different modules. e.g.,

```
export module a;
export template <class T>
class Templ { ... };

export module b;
import a;
Templ<int> ...; // instantiation attached to module b

export module c;
import a;
Templ<int> ...; // instantiation attached to module c

export module d;
import b;
import c;
Templ<int> ...
```

in the above example, the instantiation of `Templ<int>` may be attached to 
module b and c in different TUs. And in module d, the instantiation of 
`Templ<int>` from different modules will be redecls to each other. And these 
redeclarations may have different modules ownership. So it is already multiply 
owned.

https://github.com/llvm/llvm-project/pull/126842
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to