aboutsummaryrefslogtreecommitdiff
path: root/clang/test/Modules/GH154840.cpp
blob: afeb39acb548443b26ecf63537348937e998ce65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: split-file %s %t
// RUN: cd %t
//
// RUN: %clang_cc1 -fmodule-name=A -fno-cxx-modules -emit-module -fmodules -xc++ A.cppmap -o A.pcm
// RUN: %clang_cc1 -fmodule-name=B -fno-cxx-modules -emit-module -fmodules -xc++ B.cppmap -o B.pcm -fmodule-file=A.pcm
// RUN: %clang_cc1 -fmodule-name=C -fno-cxx-modules -emit-module -fmodules -xc++ C.cppmap -o C.pcm -fmodule-file=A.pcm
// RUN: %clang_cc1 -fmodule-name=D -fno-cxx-modules -emit-module -fmodules -xc++ D.cppmap -o D.pcm -fmodule-file=A.pcm
// RUN: %clang_cc1 -fmodule-name=E -fno-cxx-modules -emit-module -fmodules -xc++ E.cppmap -o E.pcm -fmodule-file=D.pcm -fmodule-file=B.pcm -fmodule-file=C.pcm
// RUN: %clang_cc1 -fno-cxx-modules -fmodules -fmodule-file=B.pcm -fmodule-file=E.pcm -emit-llvm -o /dev/null S.cpp

//--- A.h
namespace std {

template <class T> void zz(T);

template <class> struct vec {
  struct w {};
  struct xx {};

  vec(vec &) { init(); }
  constexpr vec &operator=(const vec &);
  template <class U> constexpr void pb(U);
  constexpr void init();

  w s;
};

template <class T> constexpr void vec<T>::init() {
  xx yy;
  zz(yy);
}

template <class T> constexpr vec<T> &vec<T>::operator=(const vec &) {
  pb(s);
  return *this;
}

template <class T> template <class U> constexpr void vec<T>::pb(U) { init(); }
} // namespace std

//--- A.cppmap
module "A" {
  header "A.h"
}

//--- X.h
#pragma clang module import A

namespace project {
  class thing : std::vec<thing> {};
} // namespace project

//--- B.h
#include "X.h"

//--- B.cppmap
module "B" {
  header "B.h"
}

//--- C.h
#include "X.h"

//--- C.cppmap
module "C" {
  header "C.h"
}

//--- D.h
#include "X.h"

//--- D.cppmap
module "D" {
  header "D.h"
}

//--- Y.h
#include "X.h"
struct other {
  other() : data(data) {}
  std::vec<project::thing> data;
};

//--- E.h
#include "Y.h"

//--- E.cppmap
module "E" {
  header "E.h"
}

//--- S.cpp
#pragma clang module import A
#pragma clang module import E
void func(std::vec<project::thing> *a, std::vec<project::thing> *b) { *a = *b; }