The exit code for -### is inconsistent. Unrecognized options lead to exit code 1, as expected. However, most others errors (including invalid option value) lead to exit code 0, differing from GCC and most utilities. This is a longstanding quirk of -###, and we didn't fix it because many driver tests need adjustment. Change -### to be similar to -fdriver-only -v and exit with code 1. This requires fixing many driver tests, but the end result gives us stronger tests. * Existing `RUN: %clang -### ...` tests usually don't use `CHECK-NOT: error:` or `--implicit-check-not=error:`. If a change introduces an error, such a change usually cannot be detected. * Many folks contributing new tests don't know `-fdriver-only -v`. To test no driver error/warning for new tests, they can use the familiar `-### -Werror` instead of `-fdriver-only -v -Werror`. An incomplete list of prerequisite test improvement: *2f79bb1046: add -nogpulib to some AMDGPU tests *9155e517e6: add --cuda-path= (test w/ and w/o /usr/local/cuda) *80765ede5b: -mcpu=native may return either 0 or 1, depending on whether `--target=` specifies a native target *abae53f43f: fix -fuse-ld=lld misuses (test w/o and w/o /usr/local/bin/ld.lld) *ab68df505e: add -resource-dir= and -fvisibility=hidden to some -fsanitize=cfi tests *d5ca1602f6: --rtlib=platform without --unwindlib= may fail if CLANG_DEFAULT_UNWINDLIB=unwindlib Reviewed By: jhuber6, yaxunl, dblaikie Differential Revision: https://reviews.llvm.org/D156363
58 lines
3.2 KiB
C++
58 lines
3.2 KiB
C++
// It is annoying to handle different slash direction
|
|
// in Windows and Linux. So we disable the test on Windows
|
|
// here.
|
|
// REQUIRES: !system-windows
|
|
// On AIX, the default output for `-c` may be `.s` instead of `.o`,
|
|
// which makes the test fail. So disable the test on AIX.
|
|
// REQUIRES: !system-aix
|
|
//
|
|
// RUN: rm -rf %t
|
|
// RUN: mkdir %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// Tests that the .pcm file will be generated in the same directory with the specified
|
|
// output and the name of the .pcm file should be the same with the input file.
|
|
// RUN: %clang -std=c++20 %t/Hello.cppm -fmodule-output -c -o %t/output/Hello.o \
|
|
// RUN: -### 2>&1 | FileCheck %t/Hello.cppm
|
|
//
|
|
// Tests that the output file will be generated in the input directory if the output
|
|
// file is not the corresponding object file.
|
|
// RUN: %clang -std=c++20 %t/Hello.cppm %t/AnotherModule.cppm -fmodule-output -o \
|
|
// RUN: %t/output/a.out -### 2>&1 | FileCheck %t/AnotherModule.cppm
|
|
//
|
|
// Tests that clang will reject the command line if it specifies -fmodule-output with
|
|
// multiple archs.
|
|
// RUN: not %clang %t/Hello.cppm -fmodule-output -arch i386 -arch x86_64 -### -target \
|
|
// RUN: x86_64-apple-darwin 2>&1 | FileCheck %t/Hello.cppm -check-prefix=MULTIPLE-ARCH
|
|
|
|
// Tests that the .pcm file will be generated in the same path with the specified one
|
|
// in the comamnd line.
|
|
// RUN: %clang -std=c++20 %t/Hello.cppm -fmodule-output=%t/pcm/Hello.pcm -o %t/Hello.o \
|
|
// RUN: -c -### 2>&1 | FileCheck %t/Hello.cppm --check-prefix=CHECK-SPECIFIED
|
|
//
|
|
// RUN: %clang -std=c++20 %t/Hello.cppm -fmodule-output=%t/Hello.pcm -fmodule-output -c -fsyntax-only \
|
|
// RUN: -### 2>&1 | FileCheck %t/Hello.cppm --check-prefix=CHECK-NOT-USED
|
|
|
|
//--- Hello.cppm
|
|
export module Hello;
|
|
|
|
// CHECK: "-emit-module-interface" {{.*}}"-main-file-name" "Hello.cppm" {{.*}}"-o" "{{.*}}/output/Hello.pcm" "-x" "c++" "{{.*}}/Hello.cppm"
|
|
// CHECK: "-emit-obj" {{.*}}"-main-file-name" "Hello.cppm" {{.*}}"-o" "{{.*}}/output/Hello.o" "-x" "pcm" "{{.*}}/output/Hello.pcm"
|
|
|
|
// MULTIPLE-ARCH: option '-fmodule-output' can't be used with multiple arch options
|
|
|
|
// CHECK-SPECIFIED: "-emit-module-interface" {{.*}}"-main-file-name" "Hello.cppm" {{.*}}"-o" "{{.*}}/pcm/Hello.pcm" "-x" "c++" "{{.*}}/Hello.cppm"
|
|
// CHECK-SPECIFIED: "-emit-obj" {{.*}}"-main-file-name" "Hello.cppm" {{.*}}"-o" "{{.*}}/Hello.o" "-x" "pcm" "{{.*}}/pcm/Hello.pcm"
|
|
|
|
// CHECK-NOT-USED-NOT: warning: argument unused during compilation: '-fmodule-output'
|
|
// CHECK-NOT-USED-NOT: warning: argument unused during compilation: '-fmodule-output=Hello.pcm'
|
|
// CHECK-NOT-USED-NOT: "-fmodule-output"
|
|
// CHECK-NOT-USED-NOT: "-fmodule-output="
|
|
|
|
//--- AnotherModule.cppm
|
|
export module AnotherModule;
|
|
// CHECK: "-emit-module-interface" {{.*}}"-main-file-name" "Hello.cppm" {{.*}}"-o" "{{.*}}/Hello.pcm" "-x" "c++" "{{.*}}/Hello.cppm"
|
|
// CHECK: "-emit-obj" {{.*}}"-main-file-name" "Hello.cppm" {{.*}}"-o" "{{.*}}/Hello-{{.*}}.o" "-x" "pcm" "{{.*}}/Hello.pcm"
|
|
// CHECK: "-emit-module-interface" {{.*}}"-main-file-name" "AnotherModule.cppm" {{.*}}"-o" "{{.*}}/AnotherModule.pcm" "-x" "c++" "{{.*}}/AnotherModule.cppm"
|
|
// CHECK: "-emit-obj" {{.*}}"-main-file-name" "AnotherModule.cppm" {{.*}}"-o" "{{.*}}/AnotherModule-{{.*}}.o" "-x" "pcm" "{{.*}}/AnotherModule.pcm"
|