summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/warn-unsequenced.cpp
diff options
context:
space:
mode:
authorBruno Ricci <riccibrun@gmail.com>2019-12-22 12:41:14 +0000
committerBruno Ricci <riccibrun@gmail.com>2019-12-22 12:41:14 +0000
commit7394c15178ed9cb7bd04585526a1e73396e60e17 (patch)
tree0a891d1fa3d4ab0ac15880512244f425b36d9e62 /clang/test/SemaCXX/warn-unsequenced.cpp
parent8a571538dff6dbc1b7f4fed6aed8be7ec1a00a8d (diff)
downloadbcm5719-llvm-7394c15178ed9cb7bd04585526a1e73396e60e17.tar.gz
bcm5719-llvm-7394c15178ed9cb7bd04585526a1e73396e60e17.zip
[Sema] SequenceChecker: C++17 sequencing rules for built-in operators <<, >>, .*, ->*, =, op=
Implement the C++17 sequencing rules for the built-in operators <<, >>, .*, ->*, = and op=. Differential Revision: https://reviews.llvm.org/D58297 Reviewed By: rsmith
Diffstat (limited to 'clang/test/SemaCXX/warn-unsequenced.cpp')
-rw-r--r--clang/test/SemaCXX/warn-unsequenced.cpp89
1 files changed, 69 insertions, 20 deletions
diff --git a/clang/test/SemaCXX/warn-unsequenced.cpp b/clang/test/SemaCXX/warn-unsequenced.cpp
index 43b36009fe3..62f725bd071 100644
--- a/clang/test/SemaCXX/warn-unsequenced.cpp
+++ b/clang/test/SemaCXX/warn-unsequenced.cpp
@@ -26,7 +26,6 @@ void test() {
a + a++; // cxx11-warning {{unsequenced modification and access to 'a'}}
// cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
a = a++; // cxx11-warning {{multiple unsequenced modifications to 'a'}}
- // TODO cxx17-warning@-1 {{multiple unsequenced modifications to 'a'}}
++ ++a; // ok
(a++, a++); // ok
++a + ++a; // cxx11-warning {{multiple unsequenced modifications to 'a'}}
@@ -36,13 +35,10 @@ void test() {
(a++, a) = 0; // ok, increment is sequenced before value computation of LHS
a = xs[++a]; // ok
a = xs[a++]; // cxx11-warning {{multiple unsequenced modifications to 'a'}}
- // TODO cxx17-warning@-1 {{multiple unsequenced modifications to 'a'}}
(a ? xs[0] : xs[1]) = ++a; // cxx11-warning {{unsequenced modification and access to 'a'}}
- // TODO cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
a = (++a, ++a); // ok
a = (a++, ++a); // ok
a = (a++, a++); // cxx11-warning {{multiple unsequenced modifications to 'a'}}
- // TODO cxx17-warning@-1 {{multiple unsequenced modifications to 'a'}}
f(a, a); // ok
f(a = 0, a); // cxx11-warning {{unsequenced modification and access to 'a'}}
// cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
@@ -61,7 +57,6 @@ void test() {
(++a, a) += 1; // ok
a = ++a; // ok
a += ++a; // cxx11-warning {{unsequenced modification and access to 'a'}}
- // TODO cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
A agg1 = { a++, a++ }; // ok
A agg2 = { a++ + a, a++ }; // cxx11-warning {{unsequenced modification and access to 'a'}}
@@ -77,7 +72,6 @@ void test() {
a = S { ++a, a++ }.n; // ok
A { ++a, a++ }.x; // ok
a = A { ++a, a++ }.x; // cxx11-warning {{multiple unsequenced modifications to 'a'}}
- // TODO cxx17-warning@-1 {{multiple unsequenced modifications to 'a'}}
A { ++a, a++ }.x + A { ++a, a++ }.y; // cxx11-warning {{multiple unsequenced modifications to 'a'}}
// cxx17-warning@-1 {{multiple unsequenced modifications to 'a'}}
@@ -112,14 +106,10 @@ void test() {
a += (a++, a) + a; // cxx11-warning {{unsequenced modification and access to 'a'}}
// cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
- int *p = xs;
- a = *(a++, p); // ok
a = a++ && a; // ok
- p[(long long unsigned)(p = 0)]; // cxx11-warning {{unsequenced modification and access to 'p'}}
A *q = &agg1;
(q = &agg2)->y = q->x; // cxx11-warning {{unsequenced modification and access to 'q'}}
- // TODO cxx17-warning@-1 {{unsequenced modification and access to 'q'}}
// This has undefined behavior if a == 0; otherwise, the side-effect of the
// increment is sequenced before the value computation of 'f(a, a)', which is
@@ -147,20 +137,14 @@ void test() {
xs[8] ? ++a : a++; // no-warning
xs[8] ? a+=1 : a+= 2; // no-warning
(xs[8] ? a+=1 : a+= 2) = a; // cxx11-warning {{unsequenced modification and access to 'a'}}
- // TODO cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
(xs[8] ? a+=1 : a) = a; // cxx11-warning {{unsequenced modification and access to 'a'}}
- // TODO cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
(xs[8] ? a : a+= 2) = a; // cxx11-warning {{unsequenced modification and access to 'a'}}
- // TODO cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
a = (xs[8] ? a+=1 : a+= 2); // no-warning
a += (xs[8] ? a+=1 : a+= 2); // cxx11-warning {{unsequenced modification and access to 'a'}}
- // TODO cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
(false ? a+=1 : a) = a; // no-warning
(true ? a+=1 : a) = a; // cxx11-warning {{unsequenced modification and access to 'a'}}
- // TODO cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
(false ? a : a+=2) = a; // cxx11-warning {{unsequenced modification and access to 'a'}}
- // TODO cxx17-warning@-1 {{unsequenced modification and access to 'a'}}
(true ? a : a+=2) = a; // no-warning
xs[8] && (++a + a++); // cxx11-warning {{multiple unsequenced modifications to 'a'}}
@@ -180,19 +164,15 @@ void test() {
a = ((a++, false) || (a++, false) || (a++, false) || (a++, false)); // no-warning
a = ((a++, true) && (a++, true) && (a++, true) && (a++, true)); // no-warning
a = ((a++, false) || (a++, false) || (a++, false) || a++); // cxx11-warning {{multiple unsequenced modifications to 'a'}}
- // TODO cxx17-warning@-1 {{multiple unsequenced modifications to 'a'}}
a = ((a++, true) && (a++, true) && (a++, true) && a++); // cxx11-warning {{multiple unsequenced modifications to 'a'}}
- // TODO cxx17-warning@-1 {{multiple unsequenced modifications to 'a'}}
a = ((a++, false) || (a++, false) || (a++, false) || (a + a, false)); // no-warning
a = ((a++, true) && (a++, true) && (a++, true) && (a + a, true)); // no-warning
a = (false && a++); // no-warning
a = (true && a++); // cxx11-warning {{multiple unsequenced modifications to 'a'}}
- // TODO cxx17-warning@-1 {{multiple unsequenced modifications to 'a'}}
a = (true && ++a); // no-warning
a = (true || a++); // no-warning
a = (false || a++); // cxx11-warning {{multiple unsequenced modifications to 'a'}}
- // TODO cxx17-warning@-1 {{multiple unsequenced modifications to 'a'}}
a = (false || ++a); // no-warning
(a++) | (a++); // cxx11-warning {{multiple unsequenced modifications to 'a'}}
@@ -207,6 +187,75 @@ void test() {
(__builtin_object_size(&(++a, a), 0) ? 1 : 0) + ++a; // ok
(__builtin_expect(++a, 0) ? 1 : 0) + ++a; // cxx11-warning {{multiple unsequenced modifications to 'a'}}
// cxx17-warning@-1 {{multiple unsequenced modifications to 'a'}}
+
+
+ int *p = xs;
+ a = *(a++, p); // no-warning
+ p[(long long unsigned)(p = 0)]; // cxx11-warning {{unsequenced modification and access to 'p'}}
+ (i++, xs)[i++]; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ (++i, xs)[++i]; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ (i, xs)[++i + ++i]; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ // cxx17-warning@-1 {{multiple unsequenced modifications to 'i'}}
+ p++[p == xs]; // cxx11-warning {{unsequenced modification and access to 'p'}}
+ ++p[p++ == xs]; // cxx11-warning {{unsequenced modification and access to 'p'}}
+
+ struct S { int x; } s, *ps = &s;
+ int (S::*PtrMem);
+ (PtrMem = &S::x ,s).*(PtrMem); // cxx11-warning {{unsequenced modification and access to 'PtrMem'}}
+ (PtrMem = &S::x ,s).*(PtrMem = &S::x); // cxx11-warning {{multiple unsequenced modifications to 'PtrMem'}}
+ (PtrMem = &S::x ,ps)->*(PtrMem); // cxx11-warning {{unsequenced modification and access to 'PtrMem'}}
+ (PtrMem = &S::x ,ps)->*(PtrMem = &S::x); // cxx11-warning {{multiple unsequenced modifications to 'PtrMem'}}
+ (PtrMem = nullptr) == (PtrMem = nullptr); // cxx11-warning {{multiple unsequenced modifications to 'PtrMem'}}
+ // cxx17-warning@-1 {{multiple unsequenced modifications to 'PtrMem'}}
+ (PtrMem = nullptr) == PtrMem; // cxx11-warning {{unsequenced modification and access to 'PtrMem'}}
+ // cxx17-warning@-1 {{unsequenced modification and access to 'PtrMem'}}
+
+ i++ << i++; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ ++i << ++i; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ i++ << i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i << i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i++ >> i++; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ ++i >> ++i; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ i++ >> i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i >> i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ (i++ << i) + i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ // cxx17-warning@-1 {{unsequenced modification and access to 'i'}}
+ (i++ << i) << i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+
+ ++i = i++; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ i = i+= 1; // no-warning
+ i = i++ + ++i; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ // cxx17-warning@-1 {{multiple unsequenced modifications to 'i'}}
+ ++i += ++i; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ ++i += i++; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ (i++, i) += ++i; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ (i++, i) += i++; // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ i += i+= 1; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i += i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i += ++i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i -= i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i -= ++i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i *= i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i *= ++i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i /= i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i /= ++i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i %= i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i %= ++i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i ^= i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i ^= ++i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i |= i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i |= ++i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i &= i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i &= ++i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i <<= i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i <<= ++i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i >>= i++; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ i >>= ++i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+
+ p[i++] = i; // cxx11-warning {{unsequenced modification and access to 'i'}}
+ p[i++] = (i = 42); // cxx11-warning {{multiple unsequenced modifications to 'i'}}
+ p++[i++] = (i = p ? i++ : i++); // cxx11-warning {{unsequenced modification and access to 'p'}}
+ // cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
}
namespace members {
OpenPOWER on IntegriCloud