1*1b29b4f9SManuel Klimek// RUN: rm -rf %t 2*1b29b4f9SManuel Klimek// 3*1b29b4f9SManuel Klimek// First, create two modules a and b, with a dependency b -> a, both within 4*1b29b4f9SManuel Klimek// the same directory p1. 5*1b29b4f9SManuel Klimek// 6*1b29b4f9SManuel Klimek// RUN: mkdir -p %t/p1 7*1b29b4f9SManuel Klimek// RUN: cd %t/p1 8*1b29b4f9SManuel Klimek// 9*1b29b4f9SManuel Klimek// RUN: grep "<AM>" %s > %t/p1/a.modulemap 10*1b29b4f9SManuel Klimek// RUN: %clang_cc1 -x c++ -fmodules -emit-module -fmodule-map-file-home-is-cwd \ 11*1b29b4f9SManuel Klimek// RUN: -fmodules-embed-all-files -fmodules-local-submodule-visibility \ 12*1b29b4f9SManuel Klimek// RUN: -fmodule-name="a" -o a.pcm a.modulemap 13*1b29b4f9SManuel Klimek// 14*1b29b4f9SManuel Klimek// RUN: grep "<BM>" %s > %t/p1/b.modulemap 15*1b29b4f9SManuel Klimek// RUN: %clang_cc1 -x c++ -fmodules -emit-module -fmodule-map-file-home-is-cwd \ 16*1b29b4f9SManuel Klimek// RUN: -fmodules-embed-all-files -fmodules-local-submodule-visibility \ 17*1b29b4f9SManuel Klimek// RUN: -fmodule-name="b" -o b.pcm b.modulemap 18*1b29b4f9SManuel Klimek// 19*1b29b4f9SManuel Klimek// Next, move the whole tree p1 -> p2. 20*1b29b4f9SManuel Klimek// 21*1b29b4f9SManuel Klimek// RUN: cd %t 22*1b29b4f9SManuel Klimek// RUN: mv %t/p1 %t/p2 23*1b29b4f9SManuel Klimek// RUN: cd %t/p2 24*1b29b4f9SManuel Klimek// 25*1b29b4f9SManuel Klimek// Compile a new module c in the newly generated tree that depends on b; c.pcm 26*1b29b4f9SManuel Klimek// has to be within a subdirectory so a.modulemap will be one step up (../) from 27*1b29b4f9SManuel Klimek// c.pcm. 28*1b29b4f9SManuel Klimek// 29*1b29b4f9SManuel Klimek// RUN: mkdir %t/p2/c 30*1b29b4f9SManuel Klimek// RUN: grep "<CM>" %s > %t/p2/c/c.modulemap 31*1b29b4f9SManuel Klimek// RUN: grep "<CH>" %s > %t/p2/c/c.h 32*1b29b4f9SManuel Klimek// RUN: %clang_cc1 -x c++ -fmodules -emit-module -fmodule-map-file-home-is-cwd \ 33*1b29b4f9SManuel Klimek// RUN: -fmodules-embed-all-files -fmodules-local-submodule-visibility \ 34*1b29b4f9SManuel Klimek// RUN: -fmodule-name="c" -fmodule-file=b.pcm -o c/c.pcm c/c.modulemap 35*1b29b4f9SManuel Klimek// 36*1b29b4f9SManuel Klimek// Delete a.modulemap from its original location, and instead inject a different 37*1b29b4f9SManuel Klimek// (unrelated) a.modulemap in the path p2/p2. 38*1b29b4f9SManuel Klimek// 39*1b29b4f9SManuel Klimek// RUN: rm %t/p2/a.modulemap 40*1b29b4f9SManuel Klimek// RUN: mkdir -p %t/p2/p2 41*1b29b4f9SManuel Klimek// RUN: touch %t/p2/p2/a.modulemap 42*1b29b4f9SManuel Klimek// 43*1b29b4f9SManuel Klimek// Now compile a file c.cpp that uses c.h and the module c; it is important 44*1b29b4f9SManuel Klimek// to first load b.pcm and a.pcm before c.pcm on the command line to trigger 45*1b29b4f9SManuel Klimek// the right order of module loading. This used to trigger clang to find the 46*1b29b4f9SManuel Klimek// p2/p2/a.modulemap via the path c/../p2/a.modulemap, which is not the correct 47*1b29b4f9SManuel Klimek// relative path from c. 48*1b29b4f9SManuel Klimek// 49*1b29b4f9SManuel Klimek// RUN: grep "<CC>" %s > %t/p2/c/c.cpp 50*1b29b4f9SManuel Klimek// RUN: %clang_cc1 -I. -x c++ -fmodules \ 51*1b29b4f9SManuel Klimek// RUN: -fmodule-file=b.pcm -fmodule-file=a.pcm -fmodule-file=c/c.pcm \ 52*1b29b4f9SManuel Klimek// RUN: -o c/c.o -emit-obj c/c.cpp 53*1b29b4f9SManuel Klimek 54*1b29b4f9SManuel Klimekmodule "a" { // <AM> 55*1b29b4f9SManuel Klimek} // <AM> 56*1b29b4f9SManuel Klimek 57*1b29b4f9SManuel Klimekmodule "b" { // <BM> 58*1b29b4f9SManuel Klimek use "a" // <BM> 59*1b29b4f9SManuel Klimek} // <BM> 60*1b29b4f9SManuel Klimek 61*1b29b4f9SManuel Klimekmodule "c" { // <CM> 62*1b29b4f9SManuel Klimek header "c/c.h" // <CM> 63*1b29b4f9SManuel Klimek use "a" // <CM> 64*1b29b4f9SManuel Klimek use "b" // <CM> 65*1b29b4f9SManuel Klimek} // <CM> 66*1b29b4f9SManuel Klimek 67*1b29b4f9SManuel Klimekinline void c() {} // <CH> 68*1b29b4f9SManuel Klimek 69*1b29b4f9SManuel Klimek#include "c/c.h" // <CC> 70*1b29b4f9SManuel Klimekvoid foo() { c(); } // <CC> 71