rjmccall added inline comments.

================
Comment at: lib/Sema/SemaChecking.cpp:10668
+  if (Source->isAtomicType() || Target->isAtomicType())
+    S.Diag(E->getBeginLoc(), diag::warn_atomic_implicit_seq_cst);
+
----------------
jfb wrote:
> rjmccall wrote:
> > Why would the target be an atomic type?  And if it is an atomic type, isn't 
> > that an initialization of a temporary?  In what situation does it make 
> > sense to order the initialization of a temporary?
> In this case:
> 
> ```
> void bad_assign_1(int i) {
>   atom = i; // expected-warning {{implicit use of sequentially-consistent 
> atomic may incur stronger memory barriers than necessary}}
> }
> ```
> 
> We want to warn on assignment to atomics being implicitly `seq_cst`.
> 
> Though you're right, initialization shouldn't warn because it isn't atomic. 
> The issue is that `ATOMIC_VAR_INIT` is what needs to get used, and that's 
> weird to test. I'll add a test that just assigns (which is what 
> `ATOMIC_VAR_INIT` expands to for clang), and I'll need to update the code to 
> detect that pattern and avoid warning in that case. I guess I have to look at 
> the `Expr` and figure out if the LHS is a `Decl` or something like that.
Do we really implicitly convert the RHS of that assignment to atomic type?  
That seems wrong; `_Atomic` is really a type qualifier, and the RHS should not 
be converted to `_Atomic(T)` any more than it would be converted to `volatile 
T` for an assignment into a `volatile` l-value.


Repository:
  rC Clang

https://reviews.llvm.org/D51084



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

Reply via email to