aaron.ballman added a comment.

Sorry for the delay in reviewing, I was out for standards meetings last week 
and couldn't get to this one. For future patches, can you be sure to upload 
them with more diff context (`-U9999` is what I usually use).

You should also add a release note for the fix.



================
Comment at: clang/lib/AST/ExprConstant.cpp:2837-2843
+    if (SA != RHS) {
+      if (Info.getLangOpts().CPlusPlus11) {
+        Info.CCEDiag(E, diag::note_constexpr_large_shift)
+            << RHS << E->getType() << LHS.getBitWidth();
+        return false;
+      }
+    }
----------------
These can be combined into one `if` with `&&`.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:11762-11763
         << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
-    return;
+
+    // We return BSV_Ok because we already done diag.
+    return BSV_Ok;
----------------
because we already done diag -> because we already emitted the diagnostic


================
Comment at: clang/lib/Sema/SemaExpr.cpp:12023-12025
+  ExpressionEvaluationContext Context = ExprEvalContexts.back().Context;
+  if (Context == ExpressionEvaluationContext::ConstantEvaluated ||
+      Context == ExpressionEvaluationContext::ImmediateFunctionContext) {
----------------
You can use `ExprEvalContexts.back().isConstantEvaluated()` instead.


================
Comment at: clang/test/C/drs/dr0xx.c:429
    */
- _Static_assert(-1 << 1 == -2, "fail"); /* Didn't shift a zero into the "sign 
bit". */
+ _Static_assert(-1 << 1 == -2, "fail");  /* expected-warning {{shifting a 
negative signed value is undefined}} */
  _Static_assert(1 << 3 == 1u << 3u, "fail"); /* Shift of a positive signed 
value does sensible things. */
----------------
The new comment doesn't match the comment above. I'm not certain when WG14 
changed the behavior from implementation-defined to undefined, but we should 
capture that information in the test because the DR has been superseded. I 
suspect it was from the twos complement changes in C2x though, so that'd be a 
good place to start looking.


================
Comment at: clang/test/Sema/shift-count-negative.c:7
+enum shiftof {
+    X = (1<<-29) //expected-warning {{shift count is negative}}
+};
----------------
When the shift is a negative *constant* value (as opposed to a signed variable 
type), should we diagnose this as an error rather than a warning? (Perhaps 
worth thinking about as a follow-up patch?)


================
Comment at: clang/test/Sema/shift-count-overflow.c:1-2
+// RUN: %clang_cc1 -x c -fsyntax-only -verify -Wshift-count-overflow %s
+// RUN: %clang_cc1 -x c -fsyntax-only -verify -Wall %s
+
----------------
No need for the `-x c` in these.


================
Comment at: clang/test/Sema/shift-count-overflow.c:5
+enum shiftof {
+    X = (1<<32) // expected-warning {{shift count >= width of type}}   
+};
----------------
This depends on the target architecture, doesn't it? You might want to add some 
target triples to the RUN line to ensure you've picked targets where this 
property holds.


================
Comment at: clang/test/Sema/shift-count-overflow.c:7-8
+};
+
+
+
----------------
Spurious newlines?


================
Comment at: clang/test/Sema/shift-negative-value.c:7
+enum shiftof {
+    X = (-1<<29) //expected-warning {{shifting a negative signed value is 
undefined}}
+};
----------------
This is another case we might want to consider if we can turn into an error (in 
a follow-up patch).


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

https://reviews.llvm.org/D141192

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

Reply via email to