[clang] Handle f(no-)strict-overflow, f(no-)wrapv, f(no-)wrapv-pointer like gcc (#126524)
We now process all 6 options left-to-right and pick whatever is active at the end. Fixes #124868.
This commit is contained in:
@@ -3096,21 +3096,39 @@ bool tools::shouldRecordCommandLine(const ToolChain &TC,
|
||||
|
||||
void tools::renderCommonIntegerOverflowOptions(const ArgList &Args,
|
||||
ArgStringList &CmdArgs) {
|
||||
// -fno-strict-overflow implies -fwrapv if it isn't disabled, but
|
||||
// -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
|
||||
bool StrictOverflow = Args.hasFlag(options::OPT_fstrict_overflow,
|
||||
options::OPT_fno_strict_overflow, true);
|
||||
if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
|
||||
if (A->getOption().matches(options::OPT_fwrapv))
|
||||
CmdArgs.push_back("-fwrapv");
|
||||
} else if (!StrictOverflow) {
|
||||
bool use_fwrapv = false;
|
||||
bool use_fwrapv_pointer = false;
|
||||
for (const Arg *A : Args.filtered(
|
||||
options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
|
||||
options::OPT_fwrapv, options::OPT_fno_wrapv,
|
||||
options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
|
||||
A->claim();
|
||||
switch (A->getOption().getID()) {
|
||||
case options::OPT_fstrict_overflow:
|
||||
use_fwrapv = false;
|
||||
use_fwrapv_pointer = false;
|
||||
break;
|
||||
case options::OPT_fno_strict_overflow:
|
||||
use_fwrapv = true;
|
||||
use_fwrapv_pointer = true;
|
||||
break;
|
||||
case options::OPT_fwrapv:
|
||||
use_fwrapv = true;
|
||||
break;
|
||||
case options::OPT_fno_wrapv:
|
||||
use_fwrapv = false;
|
||||
break;
|
||||
case options::OPT_fwrapv_pointer:
|
||||
use_fwrapv_pointer = true;
|
||||
break;
|
||||
case options::OPT_fno_wrapv_pointer:
|
||||
use_fwrapv_pointer = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (use_fwrapv)
|
||||
CmdArgs.push_back("-fwrapv");
|
||||
}
|
||||
if (Arg *A = Args.getLastArg(options::OPT_fwrapv_pointer,
|
||||
options::OPT_fno_wrapv_pointer)) {
|
||||
if (A->getOption().matches(options::OPT_fwrapv_pointer))
|
||||
CmdArgs.push_back("-fwrapv-pointer");
|
||||
} else if (!StrictOverflow) {
|
||||
if (use_fwrapv_pointer)
|
||||
CmdArgs.push_back("-fwrapv-pointer");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
// RUN: %clang -### -S -fwrapv -fno-wrapv -fwrapv -Werror %s 2>&1 | FileCheck -check-prefix=CHECK1 %s
|
||||
// CHECK1: "-fwrapv"
|
||||
//
|
||||
|
||||
// RUN: %clang -### -S -fwrapv-pointer -fno-wrapv-pointer -fwrapv-pointer -Werror %s 2>&1 | FileCheck -check-prefix=CHECK1-POINTER %s
|
||||
// CHECK1-POINTER: "-fwrapv-pointer"
|
||||
//
|
||||
|
||||
// RUN: %clang -### -S -fstrict-overflow -fno-strict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK2 %s
|
||||
// CHECK2: "-fwrapv"{{.*}}"-fwrapv-pointer"
|
||||
//
|
||||
|
||||
// RUN: %clang -### -S -fwrapv -fstrict-overflow -Werror -Werror %s 2>&1 | FileCheck -check-prefix=CHECK3 %s --implicit-check-not="-fwrapv-pointer"
|
||||
// CHECK3: "-fwrapv"
|
||||
//
|
||||
// CHECK3-NOT: "-fwrapv"
|
||||
|
||||
// RUN: %clang -### -S -fwrapv-pointer -fstrict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK3-POINTER %s --implicit-check-not="-fwrapv"
|
||||
// CHECK3-POINTER: "-fwrapv-pointer"
|
||||
//
|
||||
// RUN: %clang -### -S -fno-wrapv -fno-strict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4 %s --implicit-check-not="-fwrapv"
|
||||
// CHECK4: "-fwrapv-pointer"
|
||||
//
|
||||
// RUN: %clang -### -S -fno-wrapv-pointer -fno-strict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4-POINTER %s --implicit-check-not="-fwrapv-pointer"
|
||||
// CHECK4-POINTER: "-fwrapv"
|
||||
// CHECK3-POINTER-NOT: "-fwrapv-pointer"
|
||||
|
||||
// RUN: %clang -### -S -fno-wrapv -fno-strict-overflow -fno-wrapv-pointer -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4 %s --implicit-check-not="-fwrapv-pointer"
|
||||
// CHECK4: "-fwrapv"
|
||||
|
||||
// RUN: %clang -### -S -fno-wrapv-pointer -fno-strict-overflow -fno-wrapv -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4-POINTER %s --implicit-check-not="-fwrapv"
|
||||
// CHECK4-POINTER: "-fwrapv-pointer"
|
||||
|
||||
Reference in New Issue
Block a user