Skip to content

Commit 783275e

Browse files
authored
[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.
1 parent 6228379 commit 783275e

File tree

2 files changed

+45
-27
lines changed

2 files changed

+45
-27
lines changed

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3096,21 +3096,39 @@ bool tools::shouldRecordCommandLine(const ToolChain &TC,
30963096

30973097
void tools::renderCommonIntegerOverflowOptions(const ArgList &Args,
30983098
ArgStringList &CmdArgs) {
3099-
// -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3100-
// -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3101-
bool StrictOverflow = Args.hasFlag(options::OPT_fstrict_overflow,
3102-
options::OPT_fno_strict_overflow, true);
3103-
if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
3104-
if (A->getOption().matches(options::OPT_fwrapv))
3105-
CmdArgs.push_back("-fwrapv");
3106-
} else if (!StrictOverflow) {
3107-
CmdArgs.push_back("-fwrapv");
3099+
bool use_fwrapv = false;
3100+
bool use_fwrapv_pointer = false;
3101+
for (const Arg *A : Args.filtered(
3102+
options::OPT_fstrict_overflow, options::OPT_fno_strict_overflow,
3103+
options::OPT_fwrapv, options::OPT_fno_wrapv,
3104+
options::OPT_fwrapv_pointer, options::OPT_fno_wrapv_pointer)) {
3105+
A->claim();
3106+
switch (A->getOption().getID()) {
3107+
case options::OPT_fstrict_overflow:
3108+
use_fwrapv = false;
3109+
use_fwrapv_pointer = false;
3110+
break;
3111+
case options::OPT_fno_strict_overflow:
3112+
use_fwrapv = true;
3113+
use_fwrapv_pointer = true;
3114+
break;
3115+
case options::OPT_fwrapv:
3116+
use_fwrapv = true;
3117+
break;
3118+
case options::OPT_fno_wrapv:
3119+
use_fwrapv = false;
3120+
break;
3121+
case options::OPT_fwrapv_pointer:
3122+
use_fwrapv_pointer = true;
3123+
break;
3124+
case options::OPT_fno_wrapv_pointer:
3125+
use_fwrapv_pointer = false;
3126+
break;
3127+
}
31083128
}
3109-
if (Arg *A = Args.getLastArg(options::OPT_fwrapv_pointer,
3110-
options::OPT_fno_wrapv_pointer)) {
3111-
if (A->getOption().matches(options::OPT_fwrapv_pointer))
3112-
CmdArgs.push_back("-fwrapv-pointer");
3113-
} else if (!StrictOverflow) {
3129+
3130+
if (use_fwrapv)
3131+
CmdArgs.push_back("-fwrapv");
3132+
if (use_fwrapv_pointer)
31143133
CmdArgs.push_back("-fwrapv-pointer");
3115-
}
31163134
}

clang/test/Driver/clang_wrapv_opts.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
// RUN: %clang -### -S -fwrapv -fno-wrapv -fwrapv -Werror %s 2>&1 | FileCheck -check-prefix=CHECK1 %s
22
// CHECK1: "-fwrapv"
3-
//
3+
44
// RUN: %clang -### -S -fwrapv-pointer -fno-wrapv-pointer -fwrapv-pointer -Werror %s 2>&1 | FileCheck -check-prefix=CHECK1-POINTER %s
55
// CHECK1-POINTER: "-fwrapv-pointer"
6-
//
6+
77
// RUN: %clang -### -S -fstrict-overflow -fno-strict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK2 %s
88
// CHECK2: "-fwrapv"{{.*}}"-fwrapv-pointer"
9-
//
9+
1010
// RUN: %clang -### -S -fwrapv -fstrict-overflow -Werror -Werror %s 2>&1 | FileCheck -check-prefix=CHECK3 %s --implicit-check-not="-fwrapv-pointer"
11-
// CHECK3: "-fwrapv"
12-
//
11+
// CHECK3-NOT: "-fwrapv"
12+
1313
// RUN: %clang -### -S -fwrapv-pointer -fstrict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK3-POINTER %s --implicit-check-not="-fwrapv"
14-
// CHECK3-POINTER: "-fwrapv-pointer"
15-
//
16-
// RUN: %clang -### -S -fno-wrapv -fno-strict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4 %s --implicit-check-not="-fwrapv"
17-
// CHECK4: "-fwrapv-pointer"
18-
//
19-
// RUN: %clang -### -S -fno-wrapv-pointer -fno-strict-overflow -Werror %s 2>&1 | FileCheck -check-prefix=CHECK4-POINTER %s --implicit-check-not="-fwrapv-pointer"
20-
// CHECK4-POINTER: "-fwrapv"
14+
// CHECK3-POINTER-NOT: "-fwrapv-pointer"
15+
16+
// 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"
17+
// CHECK4: "-fwrapv"
18+
19+
// 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"
20+
// CHECK4-POINTER: "-fwrapv-pointer"

0 commit comments

Comments
 (0)