xref: /llvm-project/clang/test/VFS/fallback.c (revision 7c1d9b15eee3a34678addab2bab66f3020ac0753)
1 // RUN: rm -rf %t
2 // RUN: split-file %s %t
3 
4 // Test fallback directory remapping, ie. a directory "Base" which is used as
5 // a fallback if files are missing from "UseFirst"
6 
7 // RUN: sed -e "s@EXTERNAL_DIR@%{/t:regex_replacement}/Both/Base@g" -e "s@NAME_DIR@%{/t:regex_replacement}/Both/UseFirst@g" %t/vfs/base.yaml > %t/vfs/both.yaml
8 
9 // RUN: cp -R %t/Both %t/UseFirstOnly
10 // RUN: rm -rf %t/UseFirstOnly/Base
11 // RUN: sed -e "s@EXTERNAL_DIR@%{/t:regex_replacement}/UseFirstOnly/Base@g" -e "s@NAME_DIR@%{/t:regex_replacement}/UseFirstOnly/UseFirst@g" %t/vfs/base.yaml > %t/vfs/use-first-only.yaml
12 
13 // RUN: cp -R %t/Both %t/BaseOnly
14 // RUN: rm -rf %t/BaseOnly/UseFirst
15 // RUN: sed -e "s@EXTERNAL_DIR@%{/t:regex_replacement}/BaseOnly/Base@g" -e "s@NAME_DIR@%{/t:regex_replacement}/BaseOnly/UseFirst@g" %t/vfs/base.yaml > %t/vfs/base-only.yaml
16 
17 // RUN: cp -R %t/Both %t/BFallback
18 // RUN: rm %t/BFallback/UseFirst/B.h
19 // RUN: sed -e "s@EXTERNAL_DIR@%{/t:regex_replacement}/BFallback/Base@g" -e "s@NAME_DIR@%{/t:regex_replacement}/BFallback/UseFirst@g" %t/vfs/base.yaml > %t/vfs/b-fallback.yaml
20 
21 // RUN: cp -R %t/Both %t/CFallback
22 // RUN: rm %t/CFallback/UseFirst/C.h
23 // RUN: sed -e "s@EXTERNAL_DIR@%{/t:regex_replacement}/CFallback/Base@g" -e "s@NAME_DIR@%{/t:regex_replacement}/CFallback/UseFirst@g" %t/vfs/base.yaml > %t/vfs/c-fallback.yaml
24 
25 // Both B.h and C.h are in both folders
26 // RUN: %clang_cc1 -Werror -I %t/Both/UseFirst -ivfsoverlay %t/vfs/both.yaml -E -C %t/main.c 2>&1 | FileCheck --check-prefix=IN_UF %s
27 
28 // IN_UF: # 1 "{{.*(/|\\\\)UseFirst(/|\\\\)}}B.h"
29 // IN_UF-NEXT: // B.h in UseFirst
30 // IN_UF: # 1 "{{.*(/|\\\\)UseFirst(/|\\\\)}}C.h"
31 // IN_UF-NEXT: // C.h in UseFirst
32 
33 // Base missing, so now they are only in UseFirst
34 // RUN: %clang_cc1 -Werror -I %t/UseFirstOnly/UseFirst -ivfsoverlay %t/vfs/use-first-only.yaml -E -C %t/main.c 2>&1 | FileCheck --check-prefix=IN_UF %s
35 
36 // UseFirst missing, fallback to Base
37 // RUN: %clang_cc1 -Werror -I %t/BaseOnly/UseFirst -ivfsoverlay %t/vfs/base-only.yaml -E -C %t/main.c 2>&1 | FileCheck --check-prefix=IN_BASE %s
38 
39 // IN_BASE: # 1 "{{.*(/|\\\\)Base(/|\\\\)}}B.h"
40 // IN_BASE-NEXT: // B.h in Base
41 // IN_BASE: # 1 "{{.*(/|\\\\)Base(/|\\\\)}}C.h"
42 // IN_BASE-NEXT: // C.h in Base
43 
44 // B.h missing from UseFirst
45 // RUN: %clang_cc1 -Werror -I %t/BFallback/UseFirst -ivfsoverlay %t/vfs/b-fallback.yaml -E -C %t/main.c 2>&1 | FileCheck --check-prefix=B_FALLBACK %s
46 
47 // B_FALLBACK: # 1 "{{.*(/|\\\\)Base(/|\\\\)}}B.h"
48 // B_FALLBACK-NEXT: // B.h in Base
49 // B_FALLBACK: # 1 "{{.*(/|\\\\)UseFirst(/|\\\\)}}C.h"
50 // B_FALLBACK-NEXT: // C.h in UseFirst
51 
52 // C.h missing from UseFirst
53 // RUN: %clang_cc1 -Werror -I %t/CFallback/UseFirst -ivfsoverlay %t/vfs/c-fallback.yaml -E -C %t/main.c 2>&1 | FileCheck --check-prefix=C_FALLBACK %s
54 
55 // C_FALLBACK: # 1 "{{.*(/|\\\\)UseFirst(/|\\\\)}}B.h"
56 // C_FALLBACK-NEXT: // B.h in UseFirst
57 // C_FALLBACK: # 1 "{{.*(/|\\\\)Base(/|\\\\)}}C.h"
58 // C_FALLBACK-NEXT: // C.h in Base
59 
60 //--- main.c
61 #include "B.h"
62 
63 //--- Both/UseFirst/B.h
64 // B.h in UseFirst
65 #include "C.h"
66 
67 //--- Both/UseFirst/C.h
68 // C.h in UseFirst
69 
70 //--- Both/Base/B.h
71 // B.h in Base
72 #include "C.h"
73 
74 //--- Both/Base/C.h
75 // C.h in Base
76 
77 //--- vfs/base.yaml
78 {
79   'version' : 0,
80       'redirecting-with' : 'fallback',
81                            'roots' : [
82                              {'name' : 'NAME_DIR',
83                               'type' : 'directory-remap',
84                               'external-contents' : 'EXTERNAL_DIR'}
85                            ]
86 }
87