rsmith added a comment.

Ugh, you mentioned template argument lists and made me realize we can still 
reach problem cases that way. And with array bounds. :(

I've added back in a diagnostic for the case where we compute the linkage too 
early for a "C-like" struct. Hopefully people won't hit it too much.



================
Comment at: clang/lib/Sema/SemaDecl.cpp:4394
+        isa<EnumDecl>(D))
+      continue;
+
----------------
rjmccall wrote:
> rsmith wrote:
> > rjmccall wrote:
> > > This is essentially part of the next paragraph.
> > > 
> > > I believe `friend` declarations also do not declare "members", under the 
> > > same logic allowing `static_assert`.
> > I think you're right, but that's a defect in the wording -- a friend 
> > definition, at least, could use the class in a way that requires a linkage 
> > calculation, and the design intent as approved by the Evolution Working 
> > Group did not permit friend declarations. I'll take this back to the 
> > committee for some rewording, but I think it makes sense to proceed under 
> > the assumption that friends won't be allowed. In any case, I'm updating the 
> > diagnostic to treat friends as a special case, since they're not member 
> > declarations.
> Could it?  I think the same inability to write a self-reference that makes 
> the C-like cases okay should also apply to friends.  If you can write a 
> self-reference in a friend declaration, you can write one in a template 
> argument list in the type of a field declaration.  Well, okay,  I suppose a 
> friend function *definition* might need to be forbidden.
> 
> Anyway, I don't think it's actually a problem if the committee wants to 
> outlaw friends here, just wondering at the effective rule they're aiming for 
> in case we need to figure out how to apply it to extensions.
Hm. Now you come to mention it, I think friends might actually be fine -- or at 
least no worse than non-static data members -- from a linkage perspective.

The intended rule is described [in P1766R1 section 
2.3](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1766r1.html#proposed-resolution).
 If there are extensions that we permit in C structs, it would presumably be 
reasonable to permit them here too, but I would expect that C++-specific 
extensions should be disallowed here.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D74103



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

Reply via email to