<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/63595>63595</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [C++20] [Modules] Try to treat `B<A>` and `B<NS::A>` as the same type in using declarations
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:modules
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          ChuanqiXu9
      </td>
    </tr>
</table>

<pre>
    This comes from https://reviews.llvm.org/D153003 and revealed by @zygoloid.

The reproducer:

```
// RUN: rm -rf %t
// RUN: mkdir %t
// RUN: split-file %s %t
//
// RUN: %clang_cc1 -std=c++20 -emit-module-interface -I%t %t/module1.cppm -o %t/module1.pcm
// RUN: %clang_cc1 -std=c++20 -emit-module-interface -I%t %t/module2.cppm -o %t/module2.pcm
// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/merge.cpp -verify -fsyntax-only

//--- header.h
namespace NS {
template <int I>
class A {
};

template <template <int I_> class T>
class B {
};
}

//--- module1.cppm
// inside NS, using C = B<A>
module;
export module module1;
#include "header.h"
namespace NS {
using C = B<A>;
}
export struct D : NS::C {};

//--- module2.cppm
// inside NS, using C = B<NS::A>
module;
export module module2;
#include "header.h"
namespace NS {
using C = B<NS::A>;
}
export struct D : NS::C {};

//--- merge.cpp
// expected-no-diagnostics
import module1;
import module2;
D d;
```

The explanation is: [temp.type]/1.4 (http://eel.is/c++draft/temp.type#1.4)

> Two template-ids are the same if [...] their corresponding template template-arguments refer to the same template.

so B<A> and B<NS::A> are the same type. The stricter "same sequence of tokens" rule doesn't apply here, because using-declarations are not definitions.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vk2P4ygQ_TXkUrJFIE7ahxySuCPNYfuw0yvtbUSgHLODwQO4p7O_foWdL3f3rDSrWSlKlCp4j3r1ASIEfbSIa1JsSVHNRB8b59e7phf2m_6zL2cHp07r50YHkK7FALV3LTQxdoHwDWF7wvYeXzR-D7kxL23u_JGwfTUvOKUchFXg8QWFQQWHE5AF_ft0dMZplRNaEboZv58bBI-dd6qX6BPynZMs6fkz_h1I4fc_ngjfgG8h8zUQVsSP3O1Xpf0PvaEzOma1NpiWhHfrPtpDWCGNsMcvUs4hC1ERXknCtoRtGYUMWx2z1qneYKZtRF8LiZB9StAjPtuP7nkuu66FzL01d7L9X4nZx8TsPxLXncdDr82VvROxIbyaEKM_YqKF7AW9rk-Q1eFko3jNnDWnSbYH7izLoEGh0OfNaLeixdClmJ4-A1ltR2vEtjMiIhC-0zbCJ8IfR480IgTY3JaSVUX49p7qfvM7oC-EP8II8vwGdPsD0FX1cSD3-Z4IrG3QKgVE2A76oO0RdkB4BVvCd5sr67j_yoOvnfPxjHoBv52CcW2l6VWqaXbVkLF_k_FD7ndxnYlD9L2MUEEqjqfPqVv5ZjeAvZP4rQjsJ0W4wP-UGOzXijE5wy8W5dIXE0XwtUMZUWXWZUqLo3UhahnGNbq9C_iW9on5JkAF6kb-Zo5eJy--dkZYEbWzoMPQ8sU2NUQeTx2SoiJsP88XQNhDmvzXwY9och0I25-ngfKiTt1-28r4PF8QVk6i54_w_N3BpeMyrQIIjxAbhCBaBF2nA-R5TooqWbUH6bzH0DmrUm6uzXrFEP7Yt2hjAI81eojuBndZNLlxgrsW-nBLvU309EQpmBySViF6LSOmO4UNroDferQSwdUQ3Ve0gTAGPlWjchgsYasIouvMCRr0mIr8gFL0AcdizxRKI_yg_qiDdREU1trqwZbP1Jqrkpdihuv58uGBzh_mlM6aNS0Pcr4sVc1rXpTlis8Z1oKLoqCCq5Wa6TWjjNMlK2lRFJTm5WK1kocCV2UpmMIVWVBshTbXu3umQ-hxveRFWcyMOKAJw9uAseEKIPzcfynI9GDw67QzO_THQBbU6BBv74BZ1NEMT4vd5bZICSXF9rczRlHBsz8NyfIoIpAlvU6fJR3ycjZNejC5wjQ5oO15dtzLOeu9WU8fK0cdm_6QS9cStk8nPf9knXd_oUzlO0iQynpQ4Z8AAAD__8rvq6M">