Skip to content

Commit b442173

Browse files
nicotstellar
authored andcommitted
[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. (cherry picked from commit 783275e)
1 parent e15cd84 commit b442173

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
@@ -3098,21 +3098,39 @@ bool tools::shouldRecordCommandLine(const ToolChain &TC,
30983098

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

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)