[PATCH] D13419: Fix several problems at the intersection of template instantiations and visibility
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 29 10:51:21 PDT 2016
rsmith added inline comments.
================
Comment at: lib/AST/DeclCXX.cpp:1349-1354
+ while (!CTD->isMemberSpecialization()) {
+ auto *NewCTD = CTD->getInstantiatedFromMemberTemplate();
+ if (!NewCTD)
break;
CTD = NewCTD;
}
----------------
loladiro wrote:
> rsmith wrote:
> > The same bug exists in `VarDecl::getTemplateInstantiationPattern`; can you fix it there too?
> Do you have a test case that shows a problem with the current definition of that function? Would like to include it if possible. I tried cooking one up, but wasn't particularly successful.
Since this is only currently used by the modules visibility code, you'd presumably need something like this:
```
// submodule a.x
template<typename T> struct A {
template<typename U> static const int n;
};
```
```
// submodule a.y
import a.x
template<typename T> template<typename U> const int A<T>::n = 1;
```
```
// submodule a.z
import a.x
template<> template<typename U> const int A<int>::n = 2;
```
```
// test
import a.z
// I expect this to fail because we would incorrectly check to see whether the definition from a.y is visible, because we never check whether the definition from a.z is a member specialization.
static_assert(A<int>::n<int> == 2);
Repository:
rL LLVM
https://reviews.llvm.org/D13419
More information about the cfe-commits
mailing list