hahnjo wrote:
I tried to craft a test here, but declaration unloading in `clang-repl` is not
powerful enough (yet) to show a (user-visible) consequence of the problem.
On a high level, the problem should be triggered by:
```
clang-repl> template <typename T> struct A { void f() { } };
clang-repl> A<int>().f();
clang-repl> %undo
clang-repl> A<int>().f();
```
In principle, the `%undo` should remove the implicit template instantiation of
`f` which is then subsequently re-instantiated. This is currently not
implemented in `clang-repl` (we just re-use the first instantiation, which is
wrong in case there are more lines in between that could influence the
instantiation). With debug statements, I can verify that `f` is in
`UndefinedButUsed`, but `getUndefinedButUsed` filters it out.
The slightly more complex
```
clang-repl> template <typename T> struct A { void f() { } };
clang-repl> A<int>().f();
clang-repl> %undo
clang-repl> %undo
clang-repl> template <typename T> struct A { void f() { } };
clang-repl> A<int>().f();
```
ie unloading the entire class doesn't work either for the same reason, we never
actually treat the instantiated member function. (Subsequently this leads to
the entire `clang-repl` crashing after printing `definition with same mangled
name '_ZN1AIiE1fEv' as another definition`...)
https://github.com/llvm/llvm-project/pull/73955
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits