erichkeane added inline comments.

================
Comment at: clang/lib/AST/DeclPrinter.cpp:312
+          // printing on the left side for readbility.
+        else if (const VarDecl *VD = dyn_cast<VarDecl>(D);
+                   VD && VD->getInit() &&
----------------
giulianobelinassi wrote:
> erichkeane wrote:
> > While compiling this, I discovered that the lack of curley braces on the 
> > `else if (canPrintOnLeftSide(A))` means that this `else-if` is actually an 
> > else to THAT instead, despite its indention (which implies it should be 
> > associated with the `if (const FunctionDecl...`).
> > 
> > Which is it?  I presume the indenting is what you mean, but it hasn't been 
> > tested in a way that matters.  Can you add a test that validates the 
> > var-decl printing on the LHS ONLY happens when it 'can' print on the LHS?
> Sorry for the warning there. I will post a fixed version of this as soon as 
> my build with `-Werror=all` completes.
> 
> Just to be clear, the intended code with braces is:
> ```
>       AttrPrintLoc AttrLoc = AttrPrintLoc::Right;
>       if (mustPrintOnLeftSide(A))
>         // If we must always print on left side (e.g. declspec), then mark as
>         // so.
>         AttrLoc = AttrPrintLoc::Left;
>       else if (canPrintOnLeftSide(A)) {
>         // For functions with body defined we print the attributes on the left
>         // side so that GCC accept our dumps as well.
>         if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
>             FD && FD->isThisDeclarationADefinition())
>           // In case Decl is a function with a body, then attrs should be 
> print
>           // on the left side.
>           AttrLoc = AttrPrintLoc::Left;
> 
>           // In case it is a variable declaration with a ctor, then allow
>           // printing on the left side for readbility.
>         else if (const VarDecl *VD = dyn_cast<VarDecl>(D);
>                    VD && VD->getInit() &&
>                    VD->getInitStyle() == VarDecl::CallInit)
>           AttrLoc = AttrPrintLoc::Left;
>       }
>       // Only print the side matches the user requested.
>       if ((Loc & AttrLoc) != AttrPrintLoc::None)
>         A->printPretty(Out, Policy);
> ```
> 
> As you can see, both `if (const FunctionDecl *FD` and `else if (const VarDecl 
> *VD` are inside the  `if (canPrintOnLeftSide())`, and the `AttrLoc` variable 
> is only set to `AttrPrintLoc::Left` when this function returns `true`. Hence 
> unless there is a bug in `canPrintOnLeftSide` or `mustPrintOnLeftSide` (which 
> I don't see any), I can't see a case where PrintOnLeft is false and it prints 
> on the left side.
> 
> Now, I could be wrong on this, but IIRC the brackets on this is optional once 
> the `else if` would match the preceding else-less if, which in this case 
> would be `if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);`, which is 
> what the indentation meant.
yep, you're right, it WAS already behaving how it was supposed to.  Committed.  
Please keep an eye out for failed buildbots/etc.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141714

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

Reply via email to