[PATCH] D81330: [clang] SequenceChecker: C++17 sequencing rule for overloaded operators.

2020-06-20 Thread Bruno Ricci via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGf5bbe390d23d: [clang] SequenceChecker: C++17 sequencing rule 
for overloaded operators. (authored by riccibruno).

Changed prior to commit:
  https://reviews.llvm.org/D81330?vs=269012=272249#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D81330/new/

https://reviews.llvm.org/D81330

Files:
  clang/lib/Sema/SemaChecking.cpp
  clang/test/SemaCXX/warn-unsequenced.cpp

Index: clang/test/SemaCXX/warn-unsequenced.cpp
===
--- clang/test/SemaCXX/warn-unsequenced.cpp
+++ clang/test/SemaCXX/warn-unsequenced.cpp
@@ -278,6 +278,174 @@
   }
 }
 
+namespace overloaded_operators {
+  struct E {
+E =(E &);
+E operator()(E);
+E operator()(E, E);
+E operator[](E);
+  } e;
+  // Binary operators with unsequenced operands.
+  E operator+(E,E);
+  E operator-(E,E);
+  E operator*(E,E);
+  E operator/(E,E);
+  E operator%(E,E);
+  E operator^(E,E);
+  E operator&(E,E);
+  E operator|(E,E);
+
+  E operator<(E,E);
+  E operator>(E,E);
+  E operator==(E,E);
+  E operator!=(E,E);
+  E operator>=(E,E);
+  E operator<=(E,E);
+
+  // Binary operators where the RHS is sequenced before the LHS in C++17.
+  E operator+=(E,E);
+  E operator-=(E,E);
+  E operator*=(E,E);
+  E operator/=(E,E);
+  E operator%=(E,E);
+  E operator^=(E,E);
+  E operator&=(E,E);
+  E operator|=(E,E);
+  E operator<<=(E,E);
+  E operator>>=(E,E);
+
+  // Binary operators where the LHS is sequenced before the RHS in C++17.
+  E operator<<(E,E);
+  E operator>>(E,E);
+  E operator&&(E,E);
+  E operator||(E,E);
+  E operator,(E,E);
+  E operator->*(E,E);
+
+  void test() {
+int i = 0;
+// Binary operators with unsequenced operands.
+((void)i++,e) + ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) - ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) * ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) / ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) % ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) ^ ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) & ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) | ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+
+((void)i++,e) < ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) > ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) == ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) != ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) <= ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) >= ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+// cxx17-warning@-2 {{multiple unsequenced modifications to 'i'}}
+
+// Binary operators where the RHS is sequenced before the LHS in C++17.
+((void)i++,e) = ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) += ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) -= ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) *= ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) /= ((void)i++,e);
+// cxx11-warning@-1 {{multiple unsequenced modifications to 'i'}}
+((void)i++,e) %= ((void)i++,e);
+// 

[PATCH] D81330: [clang] SequenceChecker: C++17 sequencing rule for overloaded operators.

2020-06-16 Thread Richard Smith - zygoloid via Phabricator via cfe-commits
rsmith accepted this revision.
rsmith added a comment.
This revision is now accepted and ready to land.

It would be nice to avoid the duplication between the builtin and overloaded 
cases here, but I don't see a good way to do that. LGTM.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D81330/new/

https://reviews.llvm.org/D81330



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D81330: [clang] SequenceChecker: C++17 sequencing rule for overloaded operators.

2020-06-16 Thread Bruno Ricci via Phabricator via cfe-commits
riccibruno added a comment.

@rsmith Friendly ping on this patch and D81003 
.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D81330/new/

https://reviews.llvm.org/D81330



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits