erichkeane added inline comments.

================
Comment at: clang/docs/LanguageExtensions.rst:2442
+
+This builtin does not return a value.
+
----------------
rsmith wrote:
> erichkeane wrote:
> > I don't know if anyone would be using this value, but I wonder if there is 
> > value to making this a 'sum' of the results of `f`?  Less useful for the 
> > purposes of printf, but perhaps to a sprintf-type-function?  
> > 
> > Not sure if we have the use cases to support this however.
> I don't think you can use this directly with `sprintf` -- you'd need a 
> wrapper to update the write position as part of each call to `f`, and that 
> wrapper can handle accumulating the value returned from `sprintf`. In order 
> to do that, you'd want to provide an additional input argument that can be 
> modified as the dump progresses, and that can be used to return the overall 
> (desired) size too. So I don't think even the `sprintf` case provides 
> motivation for this, and it would add complexity (as well as making the 
> builtin less usable in the case where the printing function doesn't return 
> something addable).
> 
> I could see this being at least a little useful for a formatting function 
> that returns `std::string` or similar, but ... I think it's probably better 
> to let the formatting function deal with that itself through argument passing 
> instead of assuming that we can apply `+` to the results. WDYT?
I agree that we're probably better off just making the user write a wrapper 
function/functor to do so.  I was thinking about C folks, but you're right, 
they could pass a state object into their extended args.

I think we probably should just hold off on any attempts to do this until we 
find someone with a bonafide need.


================
Comment at: clang/lib/Sema/SemaChecking.cpp:595
+                                             PseudoObjectExpr::NoResult);
+    TheCall->setType(Wrapper->getType());
+    TheCall->setValueKind(Wrapper->getValueKind());
----------------
rsmith wrote:
> erichkeane wrote:
> > What is happening here?  I would expect the opposite to need to happen here 
> > (wrapper be set to match the call, not the other way around?).  
> This is the normal way we handle builtins with custom type checking: the 
> `SemaChecking` logic analyzes the builtin and sets the result type of the 
> call as appropriate, because the type we get from `Builtins.def` is 
> meaningless. As it happens, this is a degenerate case (compared to 
> `__builtin_reflect_struct` where this did something more interesting), 
> because the type of the `PseudoObjectExpr` is always `void` here; I can just 
> set that directly if you think that's clearer. It shouldn't matter much 
> anyway, given that the call is only used as the syntactic form of the 
> `PseudoObjectExpr`, so its type doesn't really affect anything. but following 
> the type and value kind of the `PseudoObjectExpr` seems "right" to me.
Ah, I see some other examples now, thanks for the explanation. I don't think 
setting to `void` is a good idea, in case we find a good reason to change the 
type; this ends up being just one more place we need to mess with it.


================
Comment at: clang/lib/Sema/SemaChecking.cpp:614
+  if (!PtrArgType->isPointerType() ||
+      !PtrArgType->getPointeeType()->isRecordType()) {
+    S.Diag(PtrArgResult.get()->getBeginLoc(),
----------------
rsmith wrote:
> erichkeane wrote:
> > Is this sufficient?  Couldn't this be a pointer to a union?  Do you mean 
> > the suggestion?
> Allowing this is what the existing builtin did, and there were tests for it.
> 
> I'm not sure what the best thing to do with unions is -- especially when a 
> union appears as a struct member. Perhaps the least bad approach is to print 
> out all the union members and hope that nothing goes wrong. That'll crash in 
> some cases (eg, `union { const char *p; int n; };` when the `int` is the 
> active member), but that seems to be the nature of this builtin.
> 
> I've added a FIXME to `dumpRecordValue`.
SGTM!  We DO document a few times IIRC that we accept a 'struct' param(in fact, 
the comment on line 637 n ow says we do!), so I wanted to make sure we are 
consistent there.


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