forked from OSchip/llvm-project
PR21706: -Wunsequenced was missing warnings when leaving a sequenced region that contained side effects.
llvm-svn: 223184
This commit is contained in:
parent
4a5697e659
commit
e8efd99b24
|
@ -7014,11 +7014,12 @@ class SequenceChecker : public EvaluatedExprVisitor<SequenceChecker> {
|
||||||
Self.ModAsSideEffect = &ModAsSideEffect;
|
Self.ModAsSideEffect = &ModAsSideEffect;
|
||||||
}
|
}
|
||||||
~SequencedSubexpression() {
|
~SequencedSubexpression() {
|
||||||
for (unsigned I = 0, E = ModAsSideEffect.size(); I != E; ++I) {
|
for (auto MI = ModAsSideEffect.rbegin(), ME = ModAsSideEffect.rend();
|
||||||
UsageInfo &U = Self.UsageMap[ModAsSideEffect[I].first];
|
MI != ME; ++MI) {
|
||||||
U.Uses[UK_ModAsSideEffect] = ModAsSideEffect[I].second;
|
UsageInfo &U = Self.UsageMap[MI->first];
|
||||||
Self.addUsage(U, ModAsSideEffect[I].first,
|
auto &SideEffectUsage = U.Uses[UK_ModAsSideEffect];
|
||||||
ModAsSideEffect[I].second.Use, UK_ModAsValue);
|
Self.addUsage(U, MI->first, SideEffectUsage.Use, UK_ModAsValue);
|
||||||
|
SideEffectUsage = MI->second;
|
||||||
}
|
}
|
||||||
Self.ModAsSideEffect = OldModAsSideEffect;
|
Self.ModAsSideEffect = OldModAsSideEffect;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,11 @@ void test() {
|
||||||
a = f(a++, 0); // ok
|
a = f(a++, 0); // ok
|
||||||
a = f(++a, a++); // expected-warning {{multiple unsequenced modifications}}
|
a = f(++a, a++); // expected-warning {{multiple unsequenced modifications}}
|
||||||
|
|
||||||
|
++a + f(++a, 0); // expected-warning {{multiple unsequenced modifications}}
|
||||||
|
f(++a, 0) + ++a; // expected-warning {{multiple unsequenced modifications}}
|
||||||
|
a++ + f(a++, 0); // expected-warning {{multiple unsequenced modifications}}
|
||||||
|
f(a++, 0) + a++; // expected-warning {{multiple unsequenced modifications}}
|
||||||
|
|
||||||
a = ++a; // expected-warning {{multiple unsequenced modifications}}
|
a = ++a; // expected-warning {{multiple unsequenced modifications}}
|
||||||
a += ++a; // expected-warning {{unsequenced modification and access}}
|
a += ++a; // expected-warning {{unsequenced modification and access}}
|
||||||
|
|
||||||
|
@ -48,7 +53,7 @@ void test() {
|
||||||
(1 ? a : ++a) + a; // ok
|
(1 ? a : ++a) + a; // ok
|
||||||
(xs[5] ? ++a : ++a) + a; // FIXME: warn here
|
(xs[5] ? ++a : ++a) + a; // FIXME: warn here
|
||||||
|
|
||||||
(++a, xs[6] ? ++a : 0) + a; // FIXME: warn here
|
(++a, xs[6] ? ++a : 0) + a; // expected-warning {{unsequenced modification and access}}
|
||||||
|
|
||||||
// Here, the read of the fourth 'a' might happen before or after the write to
|
// Here, the read of the fourth 'a' might happen before or after the write to
|
||||||
// the second 'a'.
|
// the second 'a'.
|
||||||
|
@ -84,5 +89,5 @@ void test() {
|
||||||
|
|
||||||
(__builtin_classify_type(++a) ? 1 : 0) + ++a; // ok
|
(__builtin_classify_type(++a) ? 1 : 0) + ++a; // ok
|
||||||
(__builtin_constant_p(++a) ? 1 : 0) + ++a; // ok
|
(__builtin_constant_p(++a) ? 1 : 0) + ++a; // ok
|
||||||
(__builtin_expect(++a, 0) ? 1 : 0) + ++a; // FIXME: warn here
|
(__builtin_expect(++a, 0) ? 1 : 0) + ++a; // expected-warning {{multiple unsequenced modifications}}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue