hokein added inline comments.

================
Comment at: clang/lib/Parse/ParseDeclCXX.cpp:2069-2078
+    if (auto *TagDecl = Actions.ActOnTag(
+            getCurScope(), TagType, TUK, StartLoc, SS, Name, NameLoc, attrs, 
AS,
+            DS.getModulePrivateSpecLoc(), TParams, Owned, IsDependent,
+            SourceLocation(), false, clang::TypeResult(),
+            DSC == DeclSpecContext::DSC_type_specifier,
+            DSC == DeclSpecContext::DSC_template_param ||
+                DSC == DeclSpecContext::DSC_template_type_arg,
----------------
hokein wrote:
> aaron.ballman wrote:
> > I think this is the wrong approach to fixing the issue. None of the other 
> > assignments to `TagOrTempResult` test for nullptr first, such as: 
> > https://github.com/llvm/llvm-project/blob/main/clang/lib/Parse/ParseDeclCXX.cpp#L2037
> >  and 
> > https://github.com/llvm/llvm-project/blob/main/clang/lib/Parse/ParseDeclCXX.cpp#L2029.
> > 
> > An `ActionResult` can be both valid/invalid *and* usable/unusable (and a 
> > `DeclResult` is a kind of `ActionResult`). When it's assigned *any pointer 
> > value* (including nullptr), it's a valid `ActionResult` but it's not a 
> > usable `ActionResult` 
> > (https://github.com/llvm/llvm-project/blob/main/clang/include/clang/Sema/Ownership.h#L166).
> > 
> > I think the correct fix is to find the places assuming a valid 
> > `ActionResult` means a nonnull pointer from `get()`, such as 
> > https://github.com/llvm/llvm-project/blob/main/clang/lib/Parse/ParseDeclCXX.cpp#L2121
> >  and switch them over to looking for a usable `ActionResult` instead.
> Thanks for the comment!
> 
> > None of the other assignments to TagOrTempResult test for nullptr first
> 
> I think the problem here is:
> - most of the `ActOn*` methods return a `DeclResult` (and inside these method 
> implementations, they return an Invalid `DeclResult` if the Decl is nullptr), 
> so `TagOrTempResult = Actions.ActOn*` is a fine pattern.
> - Only two exceptions `ActOnTagDecl` and `ActOnTemplatedFriendTag`, they 
> return a `Decl*`, so the `TagOrTempResult = Action.ActOn*` is a very 
> suspicious pattern. (IMO, they're not intentional, likely bugs).
> 
> > such as: 
> > https://github.com/llvm/llvm-project/blob/main/clang/lib/Parse/ParseDeclCXX.cpp#L2037
> >  and 
> > https://github.com/llvm/llvm-project/blob/main/clang/lib/Parse/ParseDeclCXX.cpp#L2029.
> 
> The first one is the other exception; the second one is not 
> (ActOnExplicitInstantiation returns a `DeclResult`).
> 
> > I think the correct fix is to find the places assuming a valid ActionResult 
> > means a nonnull pointer from get(), such as 
> > https://github.com/llvm/llvm-project/blob/main/clang/lib/Parse/ParseDeclCXX.cpp#L2121
> >  and switch them over to looking for a usable ActionResult instead.
> 
> This is one of the solutions. But instead of justifying every places of 
> DeclResult, I think we should fix the two exception places (by adding the 
> nullptr check in
> https://github.com/llvm/llvm-project/blob/main/clang/lib/Parse/ParseDeclCXX.cpp#L2037
>  and 
> https://github.com/llvm/llvm-project/blob/main/clang/lib/Parse/ParseDeclCXX.cpp#L2069),
>  what do you think?
I have updated the patch to check nullptr for ActOnTemplatedFriendTag as well. 
Let me know what you think (I'm also happy to do the change).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D141580

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

Reply via email to