anderslanglands added inline comments.

================
Comment at: clang/bindings/python/clang/cindex.py:1530
+
+    def record_needs_implicit_default_constructor(self):
+        """Returns True if the cursor refers to a C++ record declaration
----------------
royjacobson wrote:
> aaron.ballman wrote:
> > aaron.ballman wrote:
> > > I don't think we should expose any of the "needs" functions like this -- 
> > > those are internal implementation details of the class and I don't think 
> > > we want to calcify that into something we have to support forever. As we 
> > > add members to a class, we recalculate whether the added member causes us 
> > > to delete defaulted special members (among other things), and the "needs" 
> > > functions are basically used when the class is completed to handle lazily 
> > > created special members. I'm pretty sure that lazy creation is not 
> > > mandated by the standard, which is why I think the "needs" functions are 
> > > more of an implementation detail.
> > CC @erichkeane and @royjacobson as folks who have been in this same area of 
> > the compiler to see if they agree or disagree with my assessment there.
> I think so. The 'needs_*' functions query `DeclaredSpecialMembers` and I'm 
> pretty sure it's modified when we add the implicit definitions in the class 
> completion code. So this looks a bit suspicious. Is this API //meant// to be 
> used with incomplete classes?
> For complete classes I think looking up the default/move/copy constructor and 
> calling `isImplicit()` is the way to do it.
> 
> About the 'is deleted' API - can't the same be done for those functions as 
> well so we have a smaller API? 
> 
> If this //is// meant to be used with incomplete classes for efficiency that 
> would be another thing, I guess.
> 
So the intended use case here is I'm using libclang to parse an existing C++ 
libray's headers and generate a C interface to it. To do that I need to know if 
I need to generate default constructors etc, which the needs* methods do for me 
(I believe). The alternative is I have to check manually whether all the 
constructors/assignment operators exist, then implement the implicit 
declaration rules myself correctly for each version of the standard, which I'd 
rather avoid.

Would putting a note in the doc comment about the behaviour differing when the 
class is being constructed as originally suggested work for everyone?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D135557

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

Reply via email to