rsmith added inline comments.

================
Comment at: clang/docs/LanguageExtensions.rst:2434
+
+     bool print(int arg1, int arg2, std::initializer_list<Field> fields) {
+       for (auto f : fields) {
----------------
erichkeane wrote:
> rsmith wrote:
> > erichkeane wrote:
> > > I'm curious as to the need for the 'arg1' and 'arg2'?  Also, what is the 
> > > type of the 'fields' array that works in C?
> > This is aimed to fix a major deficiency in `__builtin_dump_struct`, that 
> > there's no way to pass information into its callback (other than stashing 
> > it in TLS).
> > 
> > As noted in the patch description, this builtin is not especially usable in 
> > C. I'm not sure whether that's fixable, given the very limited 
> > metaprogramming support in C.
> Presumably one could also put it in the functor for the callback, or even as 
> a capture in the lambda.  Though, I'm not positive I see the VALUE to passing 
> this information, but was just curious as to the intent.
Suppose you want to dump a struct to a log file, or you want the dump in a 
string. Or you want to carry along an indentation level. My first attempt at 
using `__builtin_dump_struct` essentially failed because it doesn't have 
anything like this; even if we don't want this patch, this is functionality we 
should add to that builtin.


================
Comment at: clang/docs/LanguageExtensions.rst:2462
+to the type to reflect. The second argument ``f`` should be some callable
+expression, and can be a function object or an overload set. The builtin calls
+``f``, passing any further arguments ``args...`` followed by an initializer
----------------
erichkeane wrote:
> rsmith wrote:
> > erichkeane wrote:
> > > Is the purpose of the overload set/functor so you can support multiple 
> > > types (seeing how the 'base' below works)?  How does this all work in C? 
> > > (or do we just do fields in C, since they cannot have the rest?
> > > 
> > > I wonder if we would be better if we treated this function as a 
> > > 'callback' or a 'callback set' that returned a discriminated union of a 
> > > pre-defined type that describes what is being returned.  That way it 
> > > could handle member functions, static variables, etc.
> > This doesn't really work well in C, as noted in the patch description. A 
> > set of callbacks might work a bit better across both languages, but I don't 
> > think it solves the larger problem that there's no good way to pass type 
> > information into a callback in C.
> Well, if the callback itself took the discriminated union for each thing, and 
> we did 1 callback per base/field/etc, perhaps that would be useful? I just am 
> having a hard time seeing this being all that useful in C, which is a shame.
> 
> 
I think that would work. I'm not sure it would be better, though, given that it 
loses the ability to build a type whose shape depends on the number of bases 
and fields, because you're not given them all at once. (Eg, if you want to 
build a static array of field names.)


================
Comment at: clang/docs/LanguageExtensions.rst:2473
+
+* For each direct base class, the address of the base class, in declaration
+  order.
----------------
erichkeane wrote:
> rsmith wrote:
> > erichkeane wrote:
> > > I wonder if bases should include their virtualness or access specifier.
> > I mean, maybe, but I don't have a use case for either. For access in 
> > general my leaning is to say that the built-in doesn't get special access 
> > rights -- either it can access everything or you'll get an access error if 
> > you use it -- in which case including the access for bases and fields 
> > doesn't seem likely to be super useful.
> I guess it depends on the use case for these builtins.  I saw the 
> 'dump-struct' builtin's purpose was for quick & dirty printf-debugging.  At 
> which point the format/features were less important than the action.  So from 
> that perspective, I would see this having 'special access rights' as sort of 
> a necessity.  
> 
> Though again, this is a significantly more general builtin, which comes with 
> additional potential use cases.
The use cases are the things that `__builtin_dump_struct` gets close to but 
fails at, such as: I have an `EXPECT_EQ` macro that I'd like to log the 
difference in input and output values where possible, or I want to build a 
simple print-to-string utility for structs. Or I want a dump to stout but I 
want it formatted differently from what `__builtin_dump_struct` thinks is best.

The fact that the dump built-in gets us into this area but can't solve these 
problems is frustrating.


================
Comment at: clang/lib/Sema/SemaChecking.cpp:420
+    auto *FD = IFD ? IFD->getAnonField() : dyn_cast<FieldDecl>(D);
+    if (!FD || (FD->isUnnamedBitfield() || FD->isAnonymousStructOrUnion()))
+      continue;
----------------
erichkeane wrote:
> rsmith wrote:
> > erichkeane wrote:
> > > Losing the unnamed bitfield is unfortunate, and I the 'dump struct' 
> > > handles.  As is losing the anonymous struct/union.
> > > 
> > > Also, how does this handle 'record type' members?  Does the user have to 
> > > know the inner type already?  If they already know that much information 
> > > about the type, they wouldn't really need this, right?
> > If `__builtin_dump_struct` includes unnamed bitfields, that's a bug in that 
> > builtin.
> > 
> > In general, the user function gets given the bases and members with the 
> > right types, so they can use an overload set or a template to dispatch 
> > based on that type. See the SemaCXX test for a basic example of that.
> I thought it did?  For the use case I see `__builtin_dump_struct` having, I 
> would think printing the existence of unnamed bitfields to be quite useful.
> 
> 
Why? They're not part of the value, they're just padding.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D124221

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

Reply via email to