[PATCH] D73675: Avoid many std::tie/tuple instantiations in ASTImporter

Gabor Marton via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 30 04:49:05 PST 2020


martong added a comment.

Thanks for this patch too!
However, I have a minor concern with this new approach:
If `importSeq` fails then a `ToSomething` still holds a value from the "From" context. This could cause problems if it is used later in creating the new AST node. Normally, this should not happen because we do check the return value of `importSeq`. But as the AST increases, new properties are added to a node, let's say `ToSomething2` and when we forget (by mistake) to add this to `importSeq` then we end up having a node that has a reference to something in the "From" context:

  auto ToSomething = From->getToSomething();
  auto ToSomething2 = From->getToSomething2();
  if (Error E = ImportSeq(ToSomething)) 
    return std::move(E);
  createNewNodeInToCtx(ToSomething, ToSomething2);

In contrast to the original behavior where we would end up with an uninitialized value (pointer) which seems to be easier to recognize when someone uses the merged AST.
(I am not sure how could we force `ToSomething2` into `importSeq`, perhaps a clang-tidy checker could do that.)



================
Comment at: clang/lib/AST/ASTImporter.cpp:1265
+
+  if (Error E = importSeq(ToEPI.ExceptionSpec.NoexceptExpr,
+                           ToEPI.ExceptionSpec.SourceDecl,
----------------
My concern here is that if `importSeq` fails here then `ToEPI.ExceptionSpec.NoexceptExpr` still holds a value from the "From" context and that can be a (fatal) problem later. The import should happen right after the initialization of these variables.
So, we should have something like this:
```
  ToEPI.ExceptionSpec.NoexceptExpr = FromEPI.ExceptionSpec.NoexceptExpr;
  ToEPI.ExceptionSpec.SourceDecl = FromEPI.ExceptionSpec.SourceDecl;
  ToEPI.ExceptionSpec.SourceTemplate = FromEPI.ExceptionSpec.SourceTemplate;
  if (Error E = importSeq(ToEPI.ExceptionSpec.NoexceptExpr,ToEPI.ExceptionSpec.SourceTemplate))
    return std::move(E);
  ToEPI.ExtInfo = FromEPI.ExtInfo;
  ToEPI.Variadic = FromEPI.Variadic;
  ToEPI.HasTrailingReturn = FromEPI.HasTrailingReturn;
  ToEPI.TypeQuals = FromEPI.TypeQuals;
  ToEPI.RefQualifier = FromEPI.RefQualifier;
  ToEPI.ExceptionSpec.Type = FromEPI.ExceptionSpec.Type;
  ToEPI.ExceptionSpec.Exceptions = ExceptionTypes;
```


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73675





More information about the cfe-commits mailing list