[cfe-commits] r56611 - in /cfe/trunk: include/clang/AST/DeclGroup.h lib/AST/DeclGroup.cpp
Daniel Dunbar
daniel at zuster.org
Thu Sep 25 10:46:18 PDT 2008
Cool! Some comments:
On Thu, Sep 25, 2008 at 10:13 AM, Ted Kremenek <kremenek at apple.com> wrote:
> +class DeclGroup {
> ...
> + Decl*& operator[](unsigned i) {
> + assert (i < NumDecls && "Out-of-bounds access.");
> + return *((Decl**) (this+1));
> + }
I'm still of the opinion that memory usage in the multiple declarator case is
a non-issue. I see no problem with just having a vector instead of bothering
with doing custom allocation.
Also, we don't use overloaded [] for many collections, are you sure we want
to here as opposed to providing ->getDecl()? I personally think the
later is more
transparent, especially since DeclGroupRef will be forwarding methods and
forwarding operator overloads might obscure the code even more.
> + iterator begin() {
> ...
> + DeclGroup* G = reinterpret_cast<DeclGroup*>(ThePtr & ~Mask);
> + return &(*G)[0];
> + }
> ...
> + iterator end() {
> ...
> + DeclGroup* G = reinterpret_cast<DeclGroup*>(ThePtr & ~Mask);
> + return &(*G)[0] + G->size();
> + }
Again I'd prefer DeclGroup to have begin/end here and just forward to that.
It may make sense for DeclGroupRef to have
/// asDeclGroup - Return the contained DeclGroup, if any. This will be
/// null for "packed" DeclGroups.
DeclGroup *asDeclGroup();
/// asDecl - Return the contained Decl, if any. This will be
/// null for non-"packed" DeclGroups.
Decl *asDecl();
Almost all DeclGroupRef methods should then follow the pattern:
T foo(... args ...) {
if (DeclGroup *DG = asDeclGroup())
return DG->foo(... args ...);
Decl *D = asDecl();
... implement foo semantics for a single decl ...
}
This may only be worth it if those methods are exposed, which we
may very conceivably want.
> +DeclGroup* DeclGroup::Create(ASTContext& C, unsigned numdecls, Decl** decls) {
s/numdecls/numDecls/g?
- Daniel
More information about the cfe-commits
mailing list