Home | History | Annotate | Download | only in Modules
      1 // RUN: rm -rf %t
      2 
      3 // -------------------------------
      4 // Build chained modules A, B, and C
      5 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
      6 // RUN:            -fmodule-name=a -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/a.pcm \
      7 // RUN:            2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
      8 //
      9 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
     10 // RUN:            -fmodule-file=%t/a.pcm \
     11 // RUN:            -fmodule-name=b -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/b.pcm \
     12 // RUN:            2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
     13 //
     14 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
     15 // RUN:            -fmodule-file=%t/b.pcm \
     16 // RUN:            -fmodule-name=c -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/c.pcm \
     17 // RUN:            2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
     18 //
     19 // CHECK-NO-IMPLICIT-BUILD-NOT: building module
     20 
     21 // -------------------------------
     22 // Build B with an implicit build of A
     23 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
     24 // RUN:            -fmodule-name=b -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/b-not-a.pcm \
     25 // RUN:            2>&1 | FileCheck --check-prefix=CHECK-B-NO-A %s
     26 //
     27 // CHECK-B-NO-A: While building module 'b':
     28 // CHECK-B-NO-A: building module 'a' as
     29 
     30 // -------------------------------
     31 // Check that we can use the explicitly-built A, B, and C modules.
     32 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
     33 // RUN:            -I%S/Inputs/explicit-build \
     34 // RUN:            -fmodule-file=%t/a.pcm \
     35 // RUN:            -verify %s -DHAVE_A
     36 //
     37 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
     38 // RUN:            -I%S/Inputs/explicit-build \
     39 // RUN:            -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \
     40 // RUN:            -fmodule-file=%t/a.pcm \
     41 // RUN:            -verify %s -DHAVE_A
     42 //
     43 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
     44 // RUN:            -I%S/Inputs/explicit-build \
     45 // RUN:            -fmodule-file=%t/b.pcm \
     46 // RUN:            -verify %s -DHAVE_A -DHAVE_B
     47 //
     48 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
     49 // RUN:            -I%S/Inputs/explicit-build \
     50 // RUN:            -fmodule-file=%t/a.pcm \
     51 // RUN:            -fmodule-file=%t/b.pcm \
     52 // RUN:            -verify %s -DHAVE_A -DHAVE_B
     53 //
     54 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
     55 // RUN:            -I%S/Inputs/explicit-build \
     56 // RUN:            -fmodule-file=%t/a.pcm \
     57 // RUN:            -fmodule-file=%t/b.pcm \
     58 // RUN:            -fmodule-file=%t/c.pcm \
     59 // RUN:            -verify %s -DHAVE_A -DHAVE_B -DHAVE_C
     60 //
     61 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
     62 // RUN:            -I%S/Inputs/explicit-build \
     63 // RUN:            -fmodule-file=%t/a.pcm \
     64 // RUN:            -fmodule-file=%t/c.pcm \
     65 // RUN:            -verify %s -DHAVE_A -DHAVE_B -DHAVE_C
     66 
     67 // -------------------------------
     68 // Check that -fmodule-file= in a module build makes the file transitively
     69 // available even if it's not used.
     70 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fno-implicit-modules -Rmodule-build -fno-modules-error-recovery \
     71 // RUN:            -fmodule-file=%t/b.pcm \
     72 // RUN:            -fmodule-name=d -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/d.pcm \
     73 // RUN:            2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
     74 //
     75 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fno-implicit-modules -Rmodule-build -fno-modules-error-recovery \
     76 // RUN:            -I%S/Inputs/explicit-build \
     77 // RUN:            -fmodule-file=%t/d.pcm \
     78 // RUN:            -verify %s -DHAVE_A -DHAVE_B
     79 
     80 #if HAVE_A
     81   #include "a.h"
     82   static_assert(a == 1, "");
     83 #else
     84   const int use_a = a; // expected-error {{undeclared identifier}}
     85 #endif
     86 
     87 #if HAVE_B
     88   #include "b.h"
     89   static_assert(b == 2, "");
     90 #else
     91   const int use_b = b; // expected-error {{undeclared identifier}}
     92 #endif
     93 
     94 #if HAVE_C
     95   #include "c.h"
     96   static_assert(c == 3, "");
     97 #else
     98   const int use_c = c; // expected-error {{undeclared identifier}}
     99 #endif
    100 
    101 #if HAVE_A && HAVE_B && HAVE_C
    102 // expected-no-diagnostics
    103 #endif
    104 
    105 // -------------------------------
    106 // Check that we can use a mixture of implicit and explicit modules.
    107 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    108 // RUN:            -I%S/Inputs/explicit-build \
    109 // RUN:            -fmodule-file=%t/b-not-a.pcm \
    110 // RUN:            -verify %s -DHAVE_A -DHAVE_B
    111 
    112 // -------------------------------
    113 // Try to use two different flavors of the 'a' module.
    114 // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    115 // RUN:            -fmodule-file=%t/a.pcm \
    116 // RUN:            -fmodule-file=%t/b-not-a.pcm \
    117 // RUN:            %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s
    118 //
    119 // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    120 // RUN:            -fmodule-file=%t/a.pcm \
    121 // RUN:            -fmodule-file=%t/b-not-a.pcm \
    122 // RUN:            -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \
    123 // RUN:            %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s
    124 //
    125 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    126 // RUN:            -fmodule-name=a -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/a-alt.pcm \
    127 // RUN:            2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
    128 //
    129 // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    130 // RUN:            -fmodule-file=%t/a.pcm \
    131 // RUN:            -fmodule-file=%t/a-alt.pcm \
    132 // RUN:            -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \
    133 // RUN:            %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s
    134 //
    135 // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    136 // RUN:            -fmodule-file=%t/a-alt.pcm \
    137 // RUN:            -fmodule-file=%t/a.pcm \
    138 // RUN:            -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \
    139 // RUN:            %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s
    140 //
    141 // CHECK-MULTIPLE-AS: error: module 'a' is defined in both '{{.*[/\\]}}a{{.*}}.pcm' and '{{.*[/\\]}}a{{.*}}.pcm'
    142 
    143 // -------------------------------
    144 // Try to import a PCH with -fmodule-file=
    145 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    146 // RUN:            -fmodule-name=a -emit-pch %S/Inputs/explicit-build/a.h -o %t/a.pch -DBUILDING_A_PCH \
    147 // RUN:            2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
    148 //
    149 // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    150 // RUN:            -fmodule-file=%t/a.pch \
    151 // RUN:            %s 2>&1 | FileCheck --check-prefix=CHECK-A-AS-PCH %s
    152 //
    153 // CHECK-A-AS-PCH: fatal error: AST file '{{.*}}a.pch' was not built as a module
    154 
    155 // -------------------------------
    156 // Try to import a non-AST file with -fmodule-file=
    157 //
    158 // RUN: touch %t/not.pcm
    159 //
    160 // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    161 // RUN:            -fmodule-file=%t/not.pcm \
    162 // RUN:            %s 2>&1 | FileCheck --check-prefix=CHECK-BAD-FILE %s
    163 //
    164 // CHECK-BAD-FILE: fatal error: file '{{.*}}not.pcm' is not a valid precompiled module file
    165 
    166 // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    167 // RUN:            -fmodule-file=%t/nonexistent.pcm \
    168 // RUN:            %s 2>&1 | FileCheck --check-prefix=CHECK-NO-FILE %s
    169 //
    170 // CHECK-NO-FILE: fatal error: module file '{{.*}}nonexistent.pcm' not found
    171 
    172 // RUN: mv %t/a.pcm %t/a-tmp.pcm
    173 // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    174 // RUN:            -I%S/Inputs/explicit-build \
    175 // RUN:            -fmodule-file=%t/c.pcm \
    176 // RUN:            %s 2>&1 | FileCheck --check-prefix=CHECK-NO-FILE-INDIRECT %s
    177 // RUN: mv %t/a-tmp.pcm %t/a.pcm
    178 //
    179 // CHECK-NO-FILE-INDIRECT:      error: module file '{{.*}}a.pcm' not found
    180 // CHECK-NO-FILE-INDIRECT-NEXT: note: imported by module 'b' in '{{.*}}b.pcm'
    181 // CHECK-NO-FILE-INDIRECT-NEXT: note: imported by module 'c' in '{{.*}}c.pcm'
    182 // CHECK-NO-FILE-INDIRECT-NOT:  note:
    183 
    184 // -------------------------------
    185 // Check that we don't get upset if B's timestamp is newer than C's.
    186 // RUN: touch %t/b.pcm
    187 //
    188 // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    189 // RUN:            -I%S/Inputs/explicit-build \
    190 // RUN:            -fmodule-file=%t/c.pcm \
    191 // RUN:            -verify %s -DHAVE_A -DHAVE_B -DHAVE_C
    192 //
    193 // ... but that we do get upset if our B is different from the B that C expects.
    194 //
    195 // RUN: cp %t/b-not-a.pcm %t/b.pcm
    196 //
    197 // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
    198 // RUN:            -I%S/Inputs/explicit-build \
    199 // RUN:            -fmodule-file=%t/c.pcm \
    200 // RUN:            %s -DHAVE_A -DHAVE_B -DHAVE_C 2>&1 | FileCheck --check-prefix=CHECK-MISMATCHED-B %s
    201 //
    202 // CHECK-MISMATCHED-B:      fatal error: module file '{{.*}}b.pcm' is out of date and needs to be rebuilt
    203 // CHECK-MISMATCHED-B-NEXT: note: imported by module 'c'
    204 // CHECK-MISMATCHED-B-NOT:  note:
    205