xref: /llvm-project/clang/test/Modules/polluted-operator.cppm (revision f21ead06750b670cf8ce72d6666e3550b04056a2)
1// RUN: rm -rf %t
2// RUN: mkdir -p %t
3// RUN: split-file %s %t
4//
5// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/a.cppm -o %t/a.pcm
6// RUN: %clang_cc1 -std=c++20 %t/b.cppm -fprebuilt-module-path=%t -emit-module-interface -o %t/b.pcm -verify
7//
8// Testing the behavior of `-fskip-odr-check-in-gmf`
9// RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf  -emit-module-interface %t/a.cppm -o \
10// RUN:   %t/a.pcm
11// RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf  %t/b.cppm -fprebuilt-module-path=%t \
12// RUN:   -emit-module-interface -DSKIP_ODR_CHECK_IN_GMF -o %t/b.pcm -verify
13
14// RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/a.cppm -o %t/a.pcm
15// RUN: %clang_cc1 -std=c++20 %t/b.cppm -fprebuilt-module-path=%t -emit-reduced-module-interface \
16// RUN:     -o %t/b.pcm -verify -DREDUCED
17
18//--- foo.h
19
20namespace std
21{
22    template<class _Dom1>
23    void operator &&(_Dom1 __v, _Dom1 __w)
24    {
25        return;
26    }
27}
28
29//--- bar.h
30namespace std
31{
32  template<typename... _Types>
33    struct _Traits
34    {
35      static constexpr bool _S_copy_ctor =
36   (__is_trivial(_Types) && ...);
37    };
38
39  template<typename... _Types>
40    struct variant
41    {
42      void
43      swap(variant& __rhs)
44      noexcept((__is_trivial(_Types) && ...))
45      {
46      }
47    };
48}
49
50//--- a.cppm
51module;
52// The operator&& defined in 'foo.h' will pollute the
53// expression '__is_trivial(_Types) && ...' in bar.h
54#include "foo.h"
55#include "bar.h"
56export module a;
57export namespace std {
58  using std::variant;
59  using std::_Traits;
60  using std::operator&&;
61}
62
63//--- b.cppm
64module;
65#include "bar.h"
66export module b;
67import a;
68export namespace std {
69  using std::variant;
70  using std::_Traits;
71  using std::operator&&;
72}
73
74#ifdef SKIP_ODR_CHECK_IN_GMF
75// expected-no-diagnostics
76#else
77// expected-error@* {{has different definitions in different modules; first difference is defined here found data member '_S_copy_ctor' with an initializer}}
78// expected-note@* {{but in 'a.<global>' found data member '_S_copy_ctor' with a different initializer}}
79#endif
80