From e8efd99b24a9d5ef6dc011854380dbc73cb0de8c Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 3 Dec 2014 01:05:50 +0000 Subject: [PATCH] PR21706: -Wunsequenced was missing warnings when leaving a sequenced region that contained side effects. llvm-svn: 223184 --- clang/lib/Sema/SemaChecking.cpp | 11 ++++++----- clang/test/Sema/warn-unsequenced.c | 9 +++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 91ba91e..8e55925 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -7014,11 +7014,12 @@ class SequenceChecker : public EvaluatedExprVisitor { Self.ModAsSideEffect = &ModAsSideEffect; } ~SequencedSubexpression() { - for (unsigned I = 0, E = ModAsSideEffect.size(); I != E; ++I) { - UsageInfo &U = Self.UsageMap[ModAsSideEffect[I].first]; - U.Uses[UK_ModAsSideEffect] = ModAsSideEffect[I].second; - Self.addUsage(U, ModAsSideEffect[I].first, - ModAsSideEffect[I].second.Use, UK_ModAsValue); + for (auto MI = ModAsSideEffect.rbegin(), ME = ModAsSideEffect.rend(); + MI != ME; ++MI) { + UsageInfo &U = Self.UsageMap[MI->first]; + auto &SideEffectUsage = U.Uses[UK_ModAsSideEffect]; + Self.addUsage(U, MI->first, SideEffectUsage.Use, UK_ModAsValue); + SideEffectUsage = MI->second; } Self.ModAsSideEffect = OldModAsSideEffect; } diff --git a/clang/test/Sema/warn-unsequenced.c b/clang/test/Sema/warn-unsequenced.c index a14d328..10c1ff6 100644 --- a/clang/test/Sema/warn-unsequenced.c +++ b/clang/test/Sema/warn-unsequenced.c @@ -29,6 +29,11 @@ void test() { a = f(a++, 0); // ok 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 {{unsequenced modification and access}} @@ -48,7 +53,7 @@ void test() { (1 ? a : ++a) + a; // ok (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 // the second 'a'. @@ -84,5 +89,5 @@ void test() { (__builtin_classify_type(++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}} } -- 2.7.4