254 lines · c
1// Needs symlinks2// UNSUPPORTED: system-windows3// REQUIRES: x86-registered-target4 5// RUN: rm -rf %t && mkdir %t6 7//--- If config file is specified by relative path (workdir/cfg-s2), it is searched for by that path.8 9// RUN: mkdir -p %t/workdir/subdir10// RUN: echo "@subdir/cfg-s2" > %t/workdir/cfg-111// RUN: echo "-Wundefined-var-template" > %t/workdir/subdir/cfg-s212//13// RUN: pushd %t14// RUN: %clang --config=workdir/cfg-1 -c -### %s 2>&1 | FileCheck %s -check-prefix CHECK-REL15// RUN: popd16//17// CHECK-REL: Configuration file: {{.*}}/workdir/cfg-118// CHECK-REL: -Wundefined-var-template19 20//--- Config files are searched for in binary directory as well.21//22// RUN: mkdir %t/testbin23// RUN: ln -s %clang %t/testbin/clang24// RUN: echo "-Werror" > %t/testbin/aaa.cfg25// RUN: %t/testbin/clang --config-system-dir= --config-user-dir= --config=aaa.cfg -c -no-canonical-prefixes -### %s 2>&1 | FileCheck %s -check-prefix CHECK-BIN26//27// CHECK-BIN: Configuration file: {{.*}}/testbin/aaa.cfg28// CHECK-BIN: -Werror29 30//--- Invocation x86_64-unknown-linux-gnu-clang-g++ tries x86_64-unknown-linux-gnu-clang++.cfg first.31//32// RUN: mkdir %t/testdmode33// RUN: ln -s %clang %t/testdmode/cheribsd-riscv64-hybrid-clang++34// RUN: ln -s %clang %t/testdmode/qqq-clang-g++35// RUN: ln -s %clang %t/testdmode/x86_64-clang36// RUN: ln -s %clang %t/testdmode/i386-unknown-linux-gnu-clang-g++37// RUN: ln -s %clang %t/testdmode/x86_64-unknown-linux-gnu-clang-g++38// RUN: ln -s %clang %t/testdmode/x86_64-unknown-linux-gnu-clang39// RUN: touch %t/testdmode/cheribsd-riscv64-hybrid-clang++.cfg40// RUN: touch %t/testdmode/cheribsd-riscv64-hybrid.cfg41// RUN: touch %t/testdmode/qqq-clang-g++.cfg42// RUN: touch %t/testdmode/qqq.cfg43// RUN: touch %t/testdmode/x86_64-clang.cfg44// RUN: touch %t/testdmode/x86_64.cfg45// RUN: touch %t/testdmode/x86_64-unknown-linux-gnu-clang++.cfg46// RUN: touch %t/testdmode/x86_64-unknown-linux-gnu-clang-g++.cfg47// RUN: touch %t/testdmode/x86_64-unknown-linux-gnu-clang.cfg48// RUN: touch %t/testdmode/x86_64-unknown-linux-gnu.cfg49// RUN: touch %t/testdmode/i386-unknown-linux-gnu-clang++.cfg50// RUN: touch %t/testdmode/i386-unknown-linux-gnu-clang-g++.cfg51// RUN: touch %t/testdmode/i386-unknown-linux-gnu-clang.cfg52// RUN: touch %t/testdmode/i386-unknown-linux-gnu.cfg53// RUN: touch %t/testdmode/clang++.cfg54// RUN: touch %t/testdmode/clang-g++.cfg55// RUN: touch %t/testdmode/clang.cfg56// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:'57//58// FULL1: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang++.cfg59 60//--- -m32 overrides triple.61//62// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-I386 --implicit-check-not 'Configuration file:'63//64// FULL1-I386: Configuration file: {{.*}}/testdmode/i386-unknown-linux-gnu-clang++.cfg65 66//--- --target= also works for overriding triple.67//68// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --target=i386-unknown-linux-gnu --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-I386 --implicit-check-not 'Configuration file:'69 70//--- With --target= + -m64, -m64 takes precedence.71//72// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --target=i386-unknown-linux-gnu -m64 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:'73 74//--- i386 prefix also works for 32-bit.75//76// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/i386-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-I386 --implicit-check-not 'Configuration file:'77 78//--- i386 prefix + -m64 also works for 64-bit.79//80// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/i386-unknown-linux-gnu-clang-g++ -m64 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:'81 82//--- File specified by --config= is loaded after the one inferred from the executable.83//84// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir=%S/Inputs/config --config-user-dir= --config=i386-qqq.cfg -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix EXPLICIT --implicit-check-not 'Configuration file:'85//86// EXPLICIT: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang++.cfg87// EXPLICIT-NEXT: Configuration file: {{.*}}/Inputs/config/i386-qqq.cfg88 89//--- --no-default-config --config= loads only specified file.90//91// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir=%S/Inputs/config --config-user-dir= --no-default-config --config=i386-qqq.cfg -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix EXPLICIT-ONLY --implicit-check-not 'Configuration file:'92//93// EXPLICIT-ONLY: Configuration file: {{.*}}/Inputs/config/i386-qqq.cfg94 95//--- --no-default-config disables default filenames.96//97// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir=%S/Inputs/config --config-user-dir= --no-default-config -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix NO-CONFIG98//99// NO-CONFIG-NOT: Configuration file:100 101//--- --driver-mode= is respected.102//103// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --driver-mode=gcc --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-GCC --implicit-check-not 'Configuration file:'104//105// FULL1-GCC: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang.cfg106 107//--- "clang" driver symlink should yield the "*-clang" configuration file.108//109// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1-GCC --implicit-check-not 'Configuration file:'110 111//--- "clang" + --driver-mode= should yield "*-clang++".112//113// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang --driver-mode=g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:'114 115//--- Clang started via name prefix that is not valid is forcing that prefix instead of target triple.116//117// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/qqq-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix QQQ --implicit-check-not 'Configuration file:'118//119// QQQ: Configuration file: {{.*}}/testdmode/qqq-clang-g++.cfg120 121//--- Explicit --target= overrides the triple even with non-standard name prefix.122//123// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/qqq-clang-g++ --target=x86_64-unknown-linux-gnu --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL1 --implicit-check-not 'Configuration file:'124 125//--- "x86_64" prefix does not form a valid triple either.126//127// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-clang --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix X86_64 --implicit-check-not 'Configuration file:'128//129// X86_64: Configuration file: {{.*}}/testdmode/x86_64-clang.cfg130 131//--- Try cheribsd prefix using misordered triple components.132//133// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/cheribsd-riscv64-hybrid-clang++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix CHERIBSD --implicit-check-not 'Configuration file:'134//135// CHERIBSD: Configuration file: {{.*}}/testdmode/cheribsd-riscv64-hybrid-clang++.cfg136 137//--- Test fallback to x86_64-unknown-linux-gnu-clang-g++.cfg.138//139// RUN: rm %t/testdmode/x86_64-unknown-linux-gnu-clang++.cfg140// RUN: rm %t/testdmode/i386-unknown-linux-gnu-clang++.cfg141// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL2 --implicit-check-not 'Configuration file:'142//143// FULL2: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu-clang-g++.cfg144 145//--- FULL2 + -m32.146//147// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL2-I386 --implicit-check-not 'Configuration file:'148//149// FULL2-I386: Configuration file: {{.*}}/testdmode/i386-unknown-linux-gnu-clang-g++.cfg150 151//--- Test fallback to x86_64-unknown-linux-gnu-clang.cfg + clang++.cfg.152//153// RUN: rm %t/testdmode/cheribsd-riscv64-hybrid-clang++.cfg154// RUN: rm %t/testdmode/qqq-clang-g++.cfg155// RUN: rm %t/testdmode/x86_64-clang.cfg156// RUN: rm %t/testdmode/x86_64-unknown-linux-gnu-clang-g++.cfg157// RUN: rm %t/testdmode/i386-unknown-linux-gnu-clang-g++.cfg158// RUN: rm %t/testdmode/x86_64-unknown-linux-gnu-clang.cfg159// RUN: rm %t/testdmode/i386-unknown-linux-gnu-clang.cfg160// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL3 --implicit-check-not 'Configuration file:'161//162// FULL3: Configuration file: {{.*}}/testdmode/clang++.cfg163// FULL3: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu.cfg164 165//--- FULL3 + -m32.166//167// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL3-I386 --implicit-check-not 'Configuration file:'168//169// FULL3-I386: Configuration file: {{.*}}/testdmode/clang++.cfg170// FULL3-I386: Configuration file: {{.*}}/testdmode/i386-unknown-linux-gnu.cfg171 172//--- FULL3 + --driver-mode=.173//174// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --driver-mode=gcc --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL3-GCC --implicit-check-not 'Configuration file:'175//176// FULL3-GCC: Configuration file: {{.*}}/testdmode/clang.cfg177// FULL3-GCC: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu.cfg178 179//--- QQQ fallback.180//181// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/qqq-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix QQQ-FALLBACK --implicit-check-not 'Configuration file:'182//183// QQQ-FALLBACK: Configuration file: {{.*}}/testdmode/clang++.cfg184// QQQ-FALLBACK: Configuration file: {{.*}}/testdmode/qqq.cfg185 186//--- "x86_64" falback.187//188// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-clang --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix X86_64-FALLBACK --implicit-check-not 'Configuration file:'189//190// X86_64-FALLBACK: Configuration file: {{.*}}/testdmode/clang.cfg191// X86_64-FALLBACK: Configuration file: {{.*}}/testdmode/x86_64.cfg192 193//--- cheribsd fallback.194//195// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/cheribsd-riscv64-hybrid-clang++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix CHERIBSD-FALLBACK --implicit-check-not 'Configuration file:'196//197// CHERIBSD-FALLBACK: Configuration file: {{.*}}/testdmode/clang++.cfg198// CHERIBSD-FALLBACK: Configuration file: {{.*}}/testdmode/cheribsd-riscv64-hybrid.cfg199 200//--- Test fallback to x86_64-unknown-linux-gnu.cfg + clang-g++.cfg.201//202// RUN: rm %t/testdmode/clang++.cfg203// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL4 --implicit-check-not 'Configuration file:'204//205// FULL4: Configuration file: {{.*}}/testdmode/clang-g++.cfg206// FULL4: Configuration file: {{.*}}/testdmode/x86_64-unknown-linux-gnu.cfg207 208//--- Test fallback to clang-g++.cfg if x86_64-unknown-linux-gnu-clang.cfg does not exist.209//210// RUN: rm %t/testdmode/x86_64-unknown-linux-gnu.cfg211// RUN: rm %t/testdmode/i386-unknown-linux-gnu.cfg212// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL5 --implicit-check-not 'Configuration file:'213//214// FULL5: Configuration file: {{.*}}/testdmode/clang-g++.cfg215 216//--- FULL5 + -m32.217//218// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ -m32 --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix FULL5-I386 --implicit-check-not 'Configuration file:'219//220// FULL5-I386: Configuration file: {{.*}}/testdmode/clang-g++.cfg221 222//--- Test that incorrect driver mode config file is not used.223//224// RUN: rm %t/testdmode/clang-g++.cfg225// RUN: env -u CLANG_NO_DEFAULT_CONFIG %t/testdmode/x86_64-unknown-linux-gnu-clang-g++ --config-system-dir= --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix NO-CONFIG226 227//--- Tilde expansion in user configuration file directory228//229// RUN: env HOME=%S/Inputs/config %clang -### --config-user-dir=~ -v 2>&1 | FileCheck %s --check-prefix=CHECK-TILDE230// CHECK-TILDE: User configuration file directory: {{.*}}/Inputs/config231 232//--- Fallback to stripping OS versions233//234// RUN: touch %t/testdmode/x86_64-apple-darwin23.6.0-clang.cfg235// RUN: touch %t/testdmode/x86_64-apple-darwin23-clang.cfg236// RUN: touch %t/testdmode/x86_64-apple-darwin-clang.cfg237// RUN: env -u CLANG_NO_DEFAULT_CONFIG %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN --implicit-check-not 'Configuration file:'238//239// DARWIN: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin23.6.0-clang.cfg240 241//--- DARWIN + no full version242//243// RUN: rm %t/testdmode/x86_64-apple-darwin23.6.0-clang.cfg244// RUN: env -u CLANG_NO_DEFAULT_CONFIG %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN-MAJOR --implicit-check-not 'Configuration file:'245//246// DARWIN-MAJOR: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin23-clang.cfg247 248//--- DARWIN + no version249//250// RUN: rm %t/testdmode/x86_64-apple-darwin23-clang.cfg251// RUN: env -u CLANG_NO_DEFAULT_CONFIG %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN-VERSIONLESS --implicit-check-not 'Configuration file:'252//253// DARWIN-VERSIONLESS: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin-clang.cfg254