PR21706: -Wunsequenced was missing warnings when leaving a sequenced region that...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 3 Dec 2014 01:05:50 +0000 (01:05 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 3 Dec 2014 01:05:50 +0000 (01:05 +0000)
llvm-svn: 223184

clang/lib/Sema/SemaChecking.cpp
clang/test/Sema/warn-unsequenced.c

index 91ba91e..8e55925 100644 (file)
@@ -7014,11 +7014,12 @@ class SequenceChecker : public EvaluatedExprVisitor<SequenceChecker> {
       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;
     }
index a14d328..10c1ff6 100644 (file)
@@ -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}}
 }