Home | History | Annotate | Download | only in Driver
      1 // Note: %s and %S must be preceded by --, otherwise it may be interpreted as a
      2 // command-line option, e.g. on Mac where %s is commonly under /Users.
      3 
      4 // /Yc
      5 // RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
      6 // RUN:   | FileCheck -check-prefix=CHECK-YC %s
      7 // 1. Build .pch file.
      8 // CHECK-YC: cc1
      9 // CHECK-YC: -emit-pch
     10 // CHECK-YC: -o
     11 // CHECK-YC: pchfile.pch
     12 // CHECK-YC: -x
     13 // CHECK-YC: "c++"
     14 // 2. Use .pch file.
     15 // CHECK-YC: cc1
     16 // CHECK-YC: -emit-obj
     17 // CHECK-YC: -include-pch
     18 // CHECK-YC: pchfile.pch
     19 
     20 // /Yc /Fo
     21 // /Fo overrides the .obj output filename, but not the .pch filename
     22 // RUN: %clang_cl -Werror /Fomyobj.obj /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
     23 // RUN:   | FileCheck -check-prefix=CHECK-YCO %s
     24 // 1. Build .pch file.
     25 // CHECK-YCO: cc1
     26 // CHECK-YCO: -emit-pch
     27 // CHECK-YCO: -o
     28 // CHECK-YCO: pchfile.pch
     29 // 2. Use .pch file.
     30 // CHECK-YCO: cc1
     31 // CHECK-YCO: -emit-obj
     32 // CHECK-YCO: -include-pch
     33 // CHECK-YCO: pchfile.pch
     34 // CHECK-YCO: -o
     35 // CHECK-YCO: myobj.obj
     36 
     37 // /Yc /Y-
     38 // /Y- disables pch generation
     39 // RUN: %clang_cl -Werror /Y- /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
     40 // RUN:   | FileCheck -check-prefix=CHECK-YC-Y_ %s
     41 // CHECK-YC-Y_-NOT: -emit-pch
     42 // CHECK-YC-Y_-NOT: -include-pch
     43 
     44 // /Yu
     45 // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
     46 // RUN:   | FileCheck -check-prefix=CHECK-YU %s
     47 // Use .pch file, but don't build it.
     48 // CHECK-YU-NOT: -emit-pch
     49 // CHECK-YU: cc1
     50 // CHECK-YU: -emit-obj
     51 // CHECK-YU: -include-pch
     52 // CHECK-YU: pchfile.pch
     53 
     54 // /Yu /Y-
     55 // RUN: %clang_cl -Werror /Y- /Yupchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
     56 // RUN:   | FileCheck -check-prefix=CHECK-YU-Y_ %s
     57 // CHECK-YU-Y_-NOT: -emit-pch
     58 // CHECK-YU-Y_-NOT: -include-pch
     59 
     60 // /Yc /Yu -- /Yc overrides /Yc if they both refer to the same file
     61 // RUN: %clang_cl -Werror /Ycpchfile.h /Yupchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
     62 // RUN:   | FileCheck -check-prefix=CHECK-YC-YU %s
     63 // 1. Build .pch file.
     64 // CHECK-YC-YU: cc1
     65 // CHECK-YC-YU: -emit-pch
     66 // CHECK-YC-YU: -o
     67 // CHECK-YC-YU: pchfile.pch
     68 // 2. Use .pch file.
     69 // CHECK-YC-YU: cc1
     70 // CHECK-YC-YU: -emit-obj
     71 // CHECK-YC-YU: -include-pch
     72 // CHECK-YC-YU: pchfile.pch
     73 
     74 // If /Yc /Yu refer to different files, semantics are pretty wonky.  Since this
     75 // doesn't seem like something that's important in practice, just punt for now.
     76 // RUN: %clang_cl -Werror /Ycfoo1.h /Yufoo2.h /FIfoo1.h /FIfoo2.h /c -### -- %s 2>&1 \
     77 // RUN:   | FileCheck -check-prefix=CHECK-YC-YU-MISMATCH %s
     78 // CHECK-YC-YU-MISMATCH: error: support for '/Yc' and '/Yu' with different filenames not implemented yet; flags ignored
     79 
     80 // Similarly, punt on /Yc with more than one input file.
     81 // RUN: %clang_cl -Werror /Ycfoo1.h /FIfoo1.h /c -### -- %s %s 2>&1 \
     82 // RUN:   | FileCheck -check-prefix=CHECK-YC-MULTIINPUT %s
     83 // CHECK-YC-MULTIINPUT: error: support for '/Yc' with more than one source file not implemented yet; flag ignored
     84 
     85 // /Yc /Yu /Y-
     86 // RUN: %clang_cl -Werror /Ycpchfile.h /Yupchfile.h /FIpchfile.h /Y- /c -### -- %s 2>&1 \
     87 // RUN:   | FileCheck -check-prefix=CHECK-YC-YU-Y_ %s
     88 // CHECK-YC-YU-Y_-NOT: -emit-pch
     89 // CHECK-YC-YU-Y_-NOT: -include-pch
     90 
     91 // Test computation of pch filename in various cases.
     92 
     93 // /Yu /Fpout.pch => out.pch is filename
     94 // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpout.pch /c -### -- %s 2>&1 \
     95 // RUN:   | FileCheck -check-prefix=CHECK-YUFP1 %s
     96 // Use .pch file, but don't build it.
     97 // CHECK-YUFP1: -include-pch
     98 // CHECK-YUFP1: out.pch
     99 
    100 // /Yu /Fpout => out.pch is filename (.pch gets added if no extension present)
    101 // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpout.pch /c -### -- %s 2>&1 \
    102 // RUN:   | FileCheck -check-prefix=CHECK-YUFP2 %s
    103 // Use .pch file, but don't build it.
    104 // CHECK-YUFP2: -include-pch
    105 // CHECK-YUFP2: out.pch
    106 
    107 // /Yu /Fpout.bmp => out.bmp is filename (.pch not added when extension present)
    108 // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpout.bmp /c -### -- %s 2>&1 \
    109 // RUN:   | FileCheck -check-prefix=CHECK-YUFP3 %s
    110 // Use .pch file, but don't build it.
    111 // CHECK-YUFP3: -include-pch
    112 // CHECK-YUFP3: out.bmp
    113 
    114 // /Yusub/dir.h => sub/dir.pch
    115 // RUN: %clang_cl -Werror /Yusub/pchfile.h /FIsub/pchfile.h /c -### -- %s 2>&1 \
    116 // RUN:   | FileCheck -check-prefix=CHECK-YUFP4 %s
    117 // Use .pch file, but don't build it.
    118 // CHECK-YUFP4: -include-pch
    119 // CHECK-YUFP4: sub/pchfile.pch
    120 
    121 // /Yudir.h /Isub => dir.pch
    122 // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Isub /c -### -- %s 2>&1 \
    123 // RUN:   | FileCheck -check-prefix=CHECK-YUFP5 %s
    124 // Use .pch file, but don't build it.
    125 // CHECK-YUFP5: -include-pch
    126 // CHECK-YUFP5: pchfile.pch
    127 
    128 // FIXME: /Fpdir: use dir/VCx0.pch when dir is directory, where x is major MSVS
    129 // version in use.
    130 
    131 // Spot-check one use of /Fp with /Yc too, else trust the /Yu test cases above
    132 // also all assume to /Yc.
    133 // RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /Fpsub/file.pch /c -### -- %s 2>&1 \
    134 // RUN:   | FileCheck -check-prefix=CHECK-YCFP %s
    135 // 1. Build .pch file.
    136 // CHECK-YCFP: cc1
    137 // CHECK-YCFP: -emit-pch
    138 // CHECK-YCFP: -o
    139 // CHECK-YCFP: sub/file.pch
    140 // 2. Use .pch file.
    141 // CHECK-YCFP: cc1
    142 // CHECK-YCFP: -emit-obj
    143 // CHECK-YCFP: -include-pch
    144 // CHECK-YCFP: sub/file.pch
    145 
    146 // /Ycfoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h
    147 // => foo1 and foo2 go into pch, foo3 into main compilation
    148 // /Yc
    149 // RUN: %clang_cl -Werror /Ycfoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h /c -### -- %s 2>&1 \
    150 // RUN:   | FileCheck -check-prefix=CHECK-YCFIFIFI %s
    151 // 1. Build .pch file: Includes foo1.h (but NOT foo3.h) and compiles foo2.h
    152 // CHECK-YCFIFIFI: cc1
    153 // CHECK-YCFIFIFI: -emit-pch
    154 // CHECK-YCFIFIFI: -include
    155 // CHECK-YCFIFIFI: foo1.h
    156 // CHECK-YCFIFIFI-NOT: foo2.h
    157 // CHECK-YCFIFIFI-NOT: foo3.h
    158 // CHECK-YCFIFIFI: -o
    159 // CHECK-YCFIFIFI: foo2.pch
    160 // CHECK-YCFIFIFI: -x
    161 // CHECK-YCFIFIFI: "c++"
    162 // CHECK-YCFIFIFI: foo2.h
    163 // 2. Use .pch file: Inlucdes foo2.pch and foo3.h
    164 // CHECK-YCFIFIFI: cc1
    165 // CHECK-YCFIFIFI: -emit-obj
    166 // CHECK-YCFIFIFI-NOT: foo1.h
    167 // CHECK-YCFIFIFI-NOT: foo2.h
    168 // CHECK-YCFIFIFI: -include-pch
    169 // CHECK-YCFIFIFI: foo2.pch
    170 // CHECK-YCFIFIFI: -include
    171 // CHECK-YCFIFIFI: foo3.h
    172 
    173 // /Yucfoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h
    174 // => foo1 foo2 filtered out, foo3 into main compilation
    175 // RUN: %clang_cl -Werror /Yufoo2.h /FIfoo1.h /FIfoo2.h /FIfoo3.h /c -### -- %s 2>&1 \
    176 // RUN:   | FileCheck -check-prefix=CHECK-YUFIFIFI %s
    177 // Use .pch file, but don't build it.
    178 // CHECK-YUFIFIFI-NOT: -emit-pch
    179 // CHECK-YUFIFIFI: cc1
    180 // CHECK-YUFIFIFI: -emit-obj
    181 // CHECK-YUFIFIFI-NOT: foo1.h
    182 // CHECK-YUFIFIFI-NOT: foo2.h
    183 // CHECK-YUFIFIFI: -include-pch
    184 // CHECK-YUFIFIFI: foo2.pch
    185 // CHECK-YUFIFIFI: -include
    186 // CHECK-YUFIFIFI: foo3.h
    187 
    188 // FIXME: Implement support for /Ycfoo.h / /Yufoo.h without /FIfoo.h
    189 // RUN: %clang_cl -Werror /Ycfoo.h /c -### -- %s 2>&1 \
    190 // RUN:   | FileCheck -check-prefix=CHECK-YC-NOFI %s
    191 // CHECK-YC-NOFI: error: support for '/Yc' without a corresponding /FI flag not implemented yet; flag ignored
    192 // RUN: %clang_cl -Werror /Yufoo.h /c -### -- %s 2>&1 \
    193 // RUN:   | FileCheck -check-prefix=CHECK-YU-NOFI %s
    194 // CHECK-YU-NOFI: error: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
    195 
    196 // /Yc and /FI relative to /I paths...
    197 // The rules are:
    198 // Yu/Yc and FI parameter must match exactly, else it's not found
    199 // Must match literally exactly: /FI./foo.h /Ycfoo.h does _not_ work.
    200 // However, the path can be relative to /I paths.
    201 // FIXME: Update the error messages below once /FI is no longer required, but
    202 // these test cases all should stay failures as they fail with cl.exe.
    203 
    204 // Check that ./ isn't canonicalized away.
    205 // RUN: %clang_cl -Werror /Ycpchfile.h /FI./pchfile.h /c -### -- %s 2>&1 \
    206 // RUN:   | FileCheck -check-prefix=CHECK-YC-I1 %s
    207 // CHECK-YC-I1: support for '/Yc' without a corresponding /FI flag not implemented yet; flag ignored
    208 
    209 // Check that ./ isn't canonicalized away.
    210 // RUN: %clang_cl -Werror /Yc./pchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
    211 // RUN:   | FileCheck -check-prefix=CHECK-YC-I2 %s
    212 // CHECK-YC-I2: support for '/Yc' without a corresponding /FI flag not implemented yet; flag ignored
    213 
    214 // With an actual /I argument.
    215 // RUN: %clang_cl -Werror /Ifoo /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
    216 // RUN:   | FileCheck -check-prefix=CHECK-YC-I3 %s
    217 // 1. This writes pchfile.pch into the root dir, even if this will pick up
    218 //    foo/pchfile.h
    219 // CHECK-YC-I3: cc1
    220 // CHECK-YC-I3: -emit-pch
    221 // CHECK-YC-I3: -o
    222 // CHECK-YC-I3: pchfile.pch
    223 // 2. Use .pch file.
    224 // CHECK-YC-I3: cc1
    225 // CHECK-YC-I3: -emit-obj
    226 // CHECK-YC-I3: -include-pch
    227 // CHECK-YC-I3: pchfile.pch
    228 
    229 // Check that ./ isn't canonicalized away for /Yu either.
    230 // RUN: %clang_cl -Werror /Yupchfile.h /FI./pchfile.h /c -### -- %s 2>&1 \
    231 // RUN:   | FileCheck -check-prefix=CHECK-YU-I1 %s
    232 // CHECK-YU-I1: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
    233 
    234 // But /FIfoo/bar.h /Ycfoo\bar.h does work, as does /FIfOo.h /Ycfoo.H
    235 // FIXME: This part isn't implemented yet. The following two tests should not
    236 // show an error but do regular /Yu handling.
    237 // RUN: %clang_cl -Werror /YupchFILE.h /FI./pchfile.h /c -### -- %s 2>&1 \
    238 // RUN:   | FileCheck -check-prefix=CHECK-YU-CASE %s
    239 // CHECK-YU-CASE: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
    240 // RUN: %clang_cl -Werror /Yu./pchfile.h /FI.\pchfile.h /c -### -- %s 2>&1 \
    241 // RUN:   | FileCheck -check-prefix=CHECK-YU-SLASH %s
    242 // CHECK-YU-SLASH: support for '/Yu' without a corresponding /FI flag not implemented yet; flag ignored
    243 
    244 // cl.exe warns on multiple /Yc, /Yu, /Fp arguments, but clang-cl silently just
    245 // uses the last one.  This is true for e.g. /Fo too, so not warning on this
    246 // is self-consistent with clang-cl's flag handling.
    247 
    248 // Interaction with /fallback
    249 
    250 // /Yc /fallback => /Yc not passed on (but /FI is)
    251 // RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /Fpfoo.pch /fallback /c -### -- %s 2>&1 \
    252 // RUN:   | FileCheck -check-prefix=CHECK-YC-FALLBACK %s
    253 // Note that in /fallback builds, if creation of the pch fails the main compile
    254 // does still run so that /fallback can have an effect (this part is not tested)
    255 // CHECK-YC-FALLBACK: cc1
    256 // CHECK-YC-FALLBACK: -emit-obj
    257 // CHECK-YC-FALLBACK: -include-pch
    258 // CHECK-YC-FALLBACK: foo.pch
    259 // CHECK-YC-FALLBACK: ||
    260 // CHECK-YC-FALLBACK: cl.exe
    261 // CHECK-YC-FALLBACK-NOT: -include-pch
    262 // CHECK-YC-FALLBACK-NOT: /Ycpchfile.h
    263 // CHECK-YC-FALLBACK: /FIpchfile.h
    264 // CHECK-YC-FALLBACK-NOT: /Fpfoo.pch
    265 
    266 // /Yu /fallback => /Yu not passed on (but /FI is)
    267 // RUN: %clang_cl -Werror /Yupchfile.h /FIpchfile.h /Fpfoo.pch /fallback /c -### -- %s 2>&1 \
    268 // RUN:   | FileCheck -check-prefix=CHECK-YU-FALLBACK %s
    269 // CHECK-YU-FALLBACK-NOT: -emit-pch
    270 // CHECK-YU-FALLBACK: cc1
    271 // CHECK-YU-FALLBACK: -emit-obj
    272 // CHECK-YU-FALLBACK: -include-pch
    273 // CHECK-YU-FALLBACK: foo.pch
    274 // CHECK-YU-FALLBACK: ||
    275 // CHECK-YU-FALLBACK: cl.exe
    276 // CHECK-YU-FALLBACK-NOT: -include-pch
    277 // CHECK-YU-FALLBACK-NOT: /Yupchfile.h
    278 // CHECK-YU-FALLBACK: /FIpchfile.h
    279 // CHECK-YU-FALLBACK-NOT: /Fpfoo.pch
    280 
    281 // /FI without /Yu => pch file not used, even if it exists (different from
    282 // -include, which picks up .gch files if they exist).
    283 // RUN: touch %t.pch
    284 // RUN: %clang_cl -Werror /FI%t.pch /Fp%t.pch /c -### -- %s 2>&1 \
    285 // RUN:   | FileCheck -check-prefix=CHECK-FI %s
    286 // CHECK-FI-NOT: -include-pch
    287 // CHECK-FI: -include
    288 
    289 // Test interaction of /Yc with language mode flags.
    290 
    291 // If /TC changes the input language to C, a c pch file should be produced.
    292 // RUN: %clang_cl /TC -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %s 2>&1 \
    293 // RUN:   | FileCheck -check-prefix=CHECK-YCTC %s
    294 // CHECK-YCTC: cc1
    295 // CHECK-YCTC: -emit-pch
    296 // CHECK-YCTC: -o
    297 // CHECK-YCTC: pchfile.pch
    298 // CHECK-YCTC: -x
    299 // CHECK-YCTC: "c"
    300 
    301 // Also check lower-case /Tc variant.
    302 // RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /c -### /Tc%s 2>&1 \
    303 // RUN:   | FileCheck -check-prefix=CHECK-YCTc %s
    304 // CHECK-YCTc: cc1
    305 // CHECK-YCTc: -emit-pch
    306 // CHECK-YCTc: -o
    307 // CHECK-YCTc: pchfile.pch
    308 // CHECK-YCTc: -x
    309 // CHECK-YCTc: "c"
    310 
    311 // Don't crash when a non-source file is passed.
    312 // RUN: %clang_cl -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %S/Inputs/file.prof 2>&1 \
    313 // RUN:   | FileCheck -check-prefix=CHECK-NoSource %s
    314 // CHECK-NoSource: file.prof:{{.*}}input unused
    315 
    316 // ...but if an explicit file turns the file into a source file, handle it:
    317 // RUN: %clang_cl /TP -Werror /Ycpchfile.h /FIpchfile.h /c -### -- %S/Inputs/file.prof 2>&1 \
    318 // RUN:   | FileCheck -check-prefix=CHECK-NoSourceTP %s
    319 // CHECK-NoSourceTP: cc1
    320 // CHECK-NoSourceTP: -emit-pch
    321 // CHECK-NoSourceTP: -o
    322 // CHECK-NoSourceTP: pchfile.pch
    323 // CHECK-NoSourceTP: -x
    324 // CHECK-NoSourceTP: "c++"
    325