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

    <tr>
        <th>Summary</th>
        <td>
            [C++20] [Modules] False positive ODR Checking performs for template packs when generating BMI 
        </td>
    </tr>

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

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

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

<pre>
    
Reproducer:

```C++
//--- foo.h
namespace std
{
    template<class _Dom1>
    void operator &&(_Dom1 __v, _Dom1 __w)
    { 
        return;
 }
}

//--- bar.h
namespace std 
{
  template<typename... _Types>
    struct _Traits
    {
      static constexpr bool _S_copy_ctor =
   (__is_trivial(_Types) && ...);
    };

 template<typename... _Types>
    struct variant
    {
      void
 swap(variant& __rhs)
      noexcept((__is_trivial(_Types) && ...))
      {
      }
    };
}

//--- a.cppm
module;
#include "foo.h"
#include "bar.h"
export module a;

//--- b.cppm
// expected-no-diagnostics
module;
#include "bar.h"
export module b;
import a;
```

The command line:

```
clang++ -std=c++20 a.cppm --precompile -o a.pcm
clang++ -std=c++20 b.cppm -fmodule-file=a=a.pcm --precompile -o b.pcm
```

Then we will see:

```
error: 'std::_Traits' has different definitions in different modules; first difference is defined here found data member '_S_copy_ctor' with an initializer
      static constexpr bool _S_copy_ctor =
      ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
note: but in 'a.<global>' found data member '_S_copy_ctor' with a different initializer
      static constexpr bool _S_copy_ctor =
 ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
error: 'std::variant::swap' from module 'a.<global>' is not present in definition of 'variant<_Types...>' provided earlier
      swap(variant& __rhs)
      ^
note: declaration of 'swap' does not match
```

The confusing part is that the error is gone after we remove the seemingly meaningless foo.h.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVsGS4yYQ_Rp86bJKRiPLPvgwtnaqcthK1WYPuakQallkERBA9kwO-fYUwrLl3ZnsTCUaxnY3dPNeA08w58RRIe5IvieUHrqBqT_F78OWUErycsEG32m7u_kXtW5ediQtSfr4BY3VzcDRkuwxui6f6zS2A6H70KKXPhH6tFwuodU66aJTsR6dYRzB-eYyrrgEAAB47I1kHkl24JI5B1Wp-xXJPt2GnLRoQBu0zGsLhK7HthkHQlWdCD3AZJwJ3d4iSbGHmxUei36wimQTAlKUE6jyjuGVS83sq1zgBzIzKv7FYBidJAlUX18MujtGztuBe6i-Wia8u8M7h-s884ID18p5fDYWaq0lVL9VXJuXio_VyMprRKhJJVzlrTgJJoMZp6bbS9UgSZJQoGw_n7O82hfvh4mcmBVM-TeJhBW82O7MDKGbKYKuoaps5-6WDUBpfOZoPKGb97O6T_EdhOv6_sD5rYVnCTemj95eN4PEWwzNhOJyaBAIpXG3U_paX9w9Ux8-G209xGzAvqv7bM_Npo5ewGeD3GOzVHrZCHZU2nnB3Tvg_RuE-hoj-tE_wzSd8TnErx0C133PVANSKHxLF6LJJVPHqBCwDMc_K3k0aXopLyyXxiLXvRESYamBJYb37wivL-FtZLJsRShAycJ_SPFD4vqW-C1qCs4IZyElOPwJNbRWB1UEQosR2iPJHqfzTAvomINGtC1aVB4abIUSXmjlQKhZRwTvSLaHVljnr10cQbgYhw10aBFaPagGGuYZ9NjXGKSwmItBmPcsfAdMwTgdk-IvtP9BUQDg71cfkn-6t6M-6qAZj1APPtAktGAJyQ5HqWsmg27Q4iMsZnX6P-h8hMmryztp1mhEHSugtbqfTtOrhIUDpT0Yiy4yme0G0G0IuiY-RGkLehaDjdUn0WADyKwU35F_l5KS_NP94jTIJbNsNv1EpdEYsfbM8-6nKqDawQl1BMOsDyx9xzz4DmEsXvActUJgrUcbDpbFXp9wHOEQe6GO8gV6ZCr8QufirSFZNLus2WZbtsDdal0Umyzd0tWi26UMad2uOG5WdIsN39CU5Wn9sE2bvC5W6ULsaEqzNPxt0s3DKuF5VmwRsc2berWu1-QhxZ4JmUh56hNtjwvh3IC79WqVpwvJapTuclGK2pM9Tgc03pbsLkQu6-HoyEMqhfPulssLL8d71mESKZKXQPL950uOvIQnJh2C0U54cUL4tfwChw75t7GOaFtt-1AHe30Fg2H8m4NzEKcjqnAHCmP3n3-BxWDlrvPeuLAjx7fEUfhuqBOue0KfArDL19JY_QdyT-jTyNgR-jSS_icAAP__9f4KoQ">