Richard Smith | f74d946 | 2017-04-28 01:49:42 +0000 | [diff] [blame] | 1 | // RUN: rm -rf %t |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 2 | // RUN: mkdir %t |
Richard Smith | f74d946 | 2017-04-28 01:49:42 +0000 | [diff] [blame] | 3 | |
| 4 | // RUN: not %clang_cc1 -fmodules -fmodule-name=file -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E 2>&1 | FileCheck %s --check-prefix=MISSING-FWD |
| 5 | // MISSING-FWD: module 'fwd' is needed |
| 6 | |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 7 | // RUN: %clang_cc1 -fmodules -fmodule-name=fwd -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -emit-module -o %t/fwd.pcm |
| 8 | |
| 9 | // Check that we can preprocess modules, and get the expected output. |
| 10 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E -o %t/no-rewrite.ii |
| 11 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E -frewrite-includes -o %t/rewrite.ii |
| 12 | // |
| 13 | // RUN: FileCheck %s --input-file %t/no-rewrite.ii --check-prefix=CHECK --check-prefix=NO-REWRITE |
| 14 | // RUN: FileCheck %s --input-file %t/rewrite.ii --check-prefix=CHECK --check-prefix=REWRITE |
| 15 | |
| 16 | // Check that we can build a module from the preprocessed output. |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 17 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -x c++-module-map-cpp-output %t/no-rewrite.ii -emit-module -o %t/no-rewrite.pcm |
| 18 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -x c++-module-map-cpp-output %t/rewrite.ii -emit-module -o %t/rewrite.pcm |
| 19 | |
Richard Smith | 4a3751f | 2017-05-08 20:30:47 +0000 | [diff] [blame] | 20 | // Check that we can load the original module map in the same compilation (this |
| 21 | // could happen if we had a redundant -fmodule-map-file= in the original |
| 22 | // build). |
| 23 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -fmodule-map-file=%S/Inputs/preprocess/module.modulemap -x c++-module-map-cpp-output %t/rewrite.ii -emit-module -o /dev/null |
| 24 | |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 25 | // Check the module we built works. |
Richard Smith | 54f0440 | 2017-05-18 02:29:20 +0000 | [diff] [blame] | 26 | // RUN: %clang_cc1 -fmodules -fmodule-file=%t/no-rewrite.pcm %s -I%t -verify -fno-modules-error-recovery |
| 27 | // RUN: %clang_cc1 -fmodules -fmodule-file=%t/rewrite.pcm %s -I%t -verify -fno-modules-error-recovery -DREWRITE |
Richard Smith | 8b70610 | 2017-05-31 20:56:55 +0000 | [diff] [blame] | 28 | // RUN: %clang_cc1 -fmodules -fmodule-file=%t/no-rewrite.pcm %s -I%t -verify -fno-modules-error-recovery -DINCLUDE -I%S/Inputs/preprocess |
| 29 | // RUN: %clang_cc1 -fmodules -fmodule-file=%t/rewrite.pcm %s -I%t -verify -fno-modules-error-recovery -DREWRITE -DINCLUDE -I%S/Inputs/preprocess |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 30 | |
Richard Smith | 040e126 | 2017-06-02 01:55:39 +0000 | [diff] [blame] | 31 | // Now try building the module when the header files are missing. |
| 32 | // RUN: cp %S/Inputs/preprocess/fwd.h %S/Inputs/preprocess/file.h %S/Inputs/preprocess/file2.h %S/Inputs/preprocess/module.modulemap %t |
| 33 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -I%t -x c++-module-map %t/module.modulemap -E -frewrite-includes -o %t/copy.ii |
| 34 | // RUN: rm %t/fwd.h %t/file.h %t/file2.h %t/module.modulemap |
| 35 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -x c++-module-map-cpp-output %t/copy.ii -emit-module -o %t/copy.pcm |
| 36 | |
Richard Smith | ab75597 | 2017-06-05 18:10:11 +0000 | [diff] [blame] | 37 | // Check that our module contains correct mapping information for the headers. |
Richard Smith | 040e126 | 2017-06-02 01:55:39 +0000 | [diff] [blame] | 38 | // RUN: cp %S/Inputs/preprocess/fwd.h %S/Inputs/preprocess/file.h %S/Inputs/preprocess/file2.h %S/Inputs/preprocess/module.modulemap %t |
| 39 | // RUN: %clang_cc1 -fmodules -fmodule-file=%t/copy.pcm %s -I%t -verify -fno-modules-error-recovery -DCOPY -DINCLUDE |
Richard Smith | 6b19934 | 2017-06-05 18:39:31 +0000 | [diff] [blame] | 40 | // RUN: rm %t/fwd.h %t/file.h %t/file2.h %t/module.modulemap |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 41 | |
Richard Smith | ab75597 | 2017-06-05 18:10:11 +0000 | [diff] [blame] | 42 | // Check that we can preprocess from a .pcm file and that we get the same result as preprocessing from the original sources. |
| 43 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -emit-module -o %t/file.pcm |
| 44 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -I%S/Inputs/preprocess %t/file.pcm -E -frewrite-includes -o %t/file.rewrite.ii |
Richard Smith | 6b19934 | 2017-06-05 18:39:31 +0000 | [diff] [blame] | 45 | // FIXME: This check fails on Windows targets, due to canonicalization of directory separators. |
| 46 | // FIXME: cmp %t/rewrite.ii %t/file.rewrite.ii |
| 47 | // FIXME: Instead, just check that the preprocessed output is functionally equivalent to the output when preprocessing from the original sources. |
| 48 | // RUN: FileCheck %s --input-file %t/file.rewrite.ii --check-prefix=CHECK --check-prefix=REWRITE |
| 49 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -x c++-module-map-cpp-output %t/file.rewrite.ii -emit-module -o %t/file.rewrite.pcm |
| 50 | // RUN: %clang_cc1 -fmodules -fmodule-file=%t/file.rewrite.pcm %s -I%t -verify -fno-modules-error-recovery -DFILE_REWRITE |
| 51 | // RUN: %clang_cc1 -fmodules -fmodule-file=%t/file.rewrite.pcm %s -I%t -verify -fno-modules-error-recovery -DFILE_REWRITE -DINCLUDE -I%S/Inputs/preprocess |
Richard Smith | 1893475 | 2017-06-06 00:32:01 +0000 | [diff] [blame^] | 52 | // |
| 53 | // Check that language / header search options are ignored when preprocessing from a .pcm file. |
| 54 | // RUN: %clang_cc1 %t/file.pcm -E -frewrite-includes -o %t/file.rewrite.ii.2 |
| 55 | // RUN: cmp %t/file.rewrite.ii %t/file.rewrite.ii.2 |
| 56 | // |
| 57 | // RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -I%S/Inputs/preprocess %t/file.pcm -E -o %t/file.no-rewrite.ii |
| 58 | // RUN: %clang_cc1 %t/file.pcm -E -o %t/file.no-rewrite.ii.2 -Dstruct=error |
| 59 | // RUN: cmp %t/file.no-rewrite.ii %t/file.no-rewrite.ii.2 |
Richard Smith | ab75597 | 2017-06-05 18:10:11 +0000 | [diff] [blame] | 60 | |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 61 | // == module map |
| 62 | // CHECK: # 1 "{{.*}}module.modulemap" |
| 63 | // CHECK: module file { |
Richard Smith | 040e126 | 2017-06-02 01:55:39 +0000 | [diff] [blame] | 64 | // CHECK: header "file.h" { size |
| 65 | // CHECK: header "file2.h" { size |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 66 | // CHECK: } |
Richard Smith | d138630 | 2017-05-04 00:29:54 +0000 | [diff] [blame] | 67 | |
| 68 | // == file.h |
Richard Smith | f74d946 | 2017-04-28 01:49:42 +0000 | [diff] [blame] | 69 | // CHECK: # 1 "<module-includes>" |
Richard Smith | d138630 | 2017-05-04 00:29:54 +0000 | [diff] [blame] | 70 | // REWRITE: #if 0 |
| 71 | // REWRITE: #include "file.h" |
| 72 | // REWRITE: #endif |
| 73 | // |
| 74 | // FIXME: It would be preferable to consistently put the module begin/end in |
| 75 | // the same file, but the relative ordering of PP callbacks and module |
| 76 | // begin/end tokens makes that difficult. |
| 77 | // |
| 78 | // REWRITE: #pragma clang module begin file |
Richard Smith | f74d946 | 2017-04-28 01:49:42 +0000 | [diff] [blame] | 79 | // CHECK: # 1 "{{.*}}file.h" 1 |
Richard Smith | d138630 | 2017-05-04 00:29:54 +0000 | [diff] [blame] | 80 | // NO-REWRITE: #pragma clang module begin file |
| 81 | // NO-REWRITE: # 1 "{{.*}}file.h"{{$}} |
| 82 | // |
Richard Smith | f74d946 | 2017-04-28 01:49:42 +0000 | [diff] [blame] | 83 | // CHECK: struct __FILE; |
Richard Smith | d138630 | 2017-05-04 00:29:54 +0000 | [diff] [blame] | 84 | // CHECK: #pragma clang module import fwd /* clang {{-E|-frewrite-includes}}: implicit import |
Richard Smith | f74d946 | 2017-04-28 01:49:42 +0000 | [diff] [blame] | 85 | // CHECK: typedef struct __FILE FILE; |
Richard Smith | d138630 | 2017-05-04 00:29:54 +0000 | [diff] [blame] | 86 | // |
| 87 | // REWRITE: #pragma clang module end |
Richard Smith | f74d946 | 2017-04-28 01:49:42 +0000 | [diff] [blame] | 88 | // CHECK: # 2 "<module-includes>" 2 |
Richard Smith | d138630 | 2017-05-04 00:29:54 +0000 | [diff] [blame] | 89 | // NO-REWRITE: #pragma clang module end |
| 90 | |
| 91 | // == file2.h |
| 92 | // REWRITE: #if 0 |
| 93 | // REWRITE: #include "file2.h" |
| 94 | // REWRITE: #endif |
| 95 | // |
| 96 | // REWRITE: #pragma clang module begin file |
| 97 | // CHECK: # 1 "{{.*}}file2.h" 1 |
| 98 | // NO-REWRITE: #pragma clang module begin file |
| 99 | // |
| 100 | // ==== recursively re-enter file.h |
| 101 | // REWRITE: #if 0 |
| 102 | // REWRITE: #include "file.h" |
| 103 | // REWRITE: #endif |
| 104 | // |
| 105 | // REWRITE: #pragma clang module begin file |
| 106 | // CHECK: # 1 "{{.*}}file.h" 1 |
| 107 | // NO-REWRITE: #pragma clang module begin file |
| 108 | // NO-REWRITE: # 1 "{{.*}}file.h"{{$}} |
| 109 | // |
| 110 | // CHECK: struct __FILE; |
| 111 | // CHECK: #pragma clang module import fwd /* clang {{-E|-frewrite-includes}}: implicit import |
| 112 | // CHECK: typedef struct __FILE FILE; |
| 113 | // |
| 114 | // REWRITE: #pragma clang module end |
| 115 | // CHECK: # 2 "{{.*}}file2.h" 2 |
| 116 | // NO-REWRITE: #pragma clang module end |
| 117 | // NO-REWRITE: # 2 "{{.*}}file2.h"{{$}} |
| 118 | // ==== return to file2.h |
| 119 | // |
| 120 | // CHECK: extern int file2; |
| 121 | // |
| 122 | // REWRITE: #pragma clang module end |
| 123 | // CHECK: # 3 "<module-includes>" 2 |
| 124 | // NO-REWRITE: #pragma clang module end |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 125 | |
| 126 | |
Richard Smith | 54f0440 | 2017-05-18 02:29:20 +0000 | [diff] [blame] | 127 | __FILE *a; // expected-error {{declaration of '__FILE' must be imported}} |
Richard Smith | 6b19934 | 2017-06-05 18:39:31 +0000 | [diff] [blame] | 128 | #if FILE_REWRITE |
| 129 | // expected-note@file.rewrite.ii:1 {{here}} |
| 130 | #elif REWRITE |
Richard Smith | 54f0440 | 2017-05-18 02:29:20 +0000 | [diff] [blame] | 131 | // expected-note@rewrite.ii:1 {{here}} |
Richard Smith | 040e126 | 2017-06-02 01:55:39 +0000 | [diff] [blame] | 132 | #elif COPY |
| 133 | // expected-note@copy.ii:1 {{here}} |
Richard Smith | 54f0440 | 2017-05-18 02:29:20 +0000 | [diff] [blame] | 134 | #else |
| 135 | // expected-note@no-rewrite.ii:1 {{here}} |
| 136 | #endif |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 137 | |
Richard Smith | 8b70610 | 2017-05-31 20:56:55 +0000 | [diff] [blame] | 138 | #ifdef INCLUDE |
| 139 | #include "file.h" |
| 140 | #else |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 141 | #pragma clang module import file |
Richard Smith | 8b70610 | 2017-05-31 20:56:55 +0000 | [diff] [blame] | 142 | #endif |
Richard Smith | 8128f33 | 2017-05-05 22:18:51 +0000 | [diff] [blame] | 143 | |
| 144 | FILE *b; |
Richard Smith | 8b70610 | 2017-05-31 20:56:55 +0000 | [diff] [blame] | 145 | int x = file2; // ok, found in file2.h, even under -DINCLUDE |