jcsxky wrote:

@sdkrystian  Could you please take another look at this patch? The approach 
does what you said before.
When checking exception specific equivalence of the two functions, we do 
instantiation and substitute all the template parameters with instantiated 
ones. But we can't find them as we create a new `LocalInstantiationScope`. So 
these instantiated parameters should be added to current new 
`LocalInstantiationScope`(like what `addInstantiatedParametersToScope` does in 
the following code) to make sure they can be found.
Consider the test case:

```cpp
template <typename T>
struct C {
    template <int N>
    friend void func() noexcept(N == 0);
};

template <int N>
void func() noexcept(N == 0) {}

int main() {
    C<int> t;
    return 0;
}
```

Without this patch, `Sema::FindInstantiatedDecl` returns original template 
parameter in transforming exception specific when trying to find instantiated 
parameter of `N`. So we use the original parameter(`N`) whose depth is 1 in the 
primary template and this is incorrect and make the comparison failed since it 
should be 0 in the template specialization. Adding instantiated parameters to 
current `LocalInstantiationScope` makes `Sema::FindInstantiatedDecl` returns 
the correct instantiated parameter and it works.

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

Reply via email to