[PATCH] D56936: Fix handling of overriden methods during ASTImport

Shafik Yaghmour via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 23 22:22:48 PST 2019


shafik marked 17 inline comments as done.
shafik added a comment.

@martong I don't follow the discussion on `VisitParmVarDecl` an what seems like an alternate fix. Can you elaborate?



================
Comment at: lib/AST/ASTImporter.cpp:3042
 
+  if (FoundByLookup) {
+    if (auto *MD = dyn_cast<CXXMethodDecl>(FoundByLookup)) {
----------------
martong wrote:
> It is not trivial why we add this block to the code, so I think a comment would be really appreciated here.
> I was thinking about something like this:
> ```
> +  // We do not allow more than one in-class prototype of a function.  This is
> +  // because AST clients like VTableBuilder asserts on this.  VTableBuilder
> +  // assumes that only one function can override a function. Building a redecl
> +  // chain would result there are more than one function which override the
> +  // base function (even if they are part of the same redecl chain inside the
> +  // derived class.)
> ```
Just for clarification, from a C++ perspective, I would say "in-class declaration" rather than "in-class prototype" and therefore `VTableBuilder` assumes only one in class declaration and building a redecal chain would result in more than one in-class declaration being present. 

Does that makes sense?


================
Comment at: unittests/AST/ASTImporterTest.cpp:2344
+
+TEST_P(ImportFunctions, ImportOverriddenMethodTwiceOutOfClassDefTwoTUs) {
+  auto CodeTU0 =
----------------
balazske wrote:
> The previous tests use two TUs too so the name for this is not exact (here the code is different, maybe use `ImportOverriddenMethodTwiceOutOfClassDefInSeparateCode`?). This test does roughly the same as `ImportOverriddenMethodTwiceDefinitionFirst` but with the definition last and out-of-class version. (Name can be `ImportOverriddenMethodTwiceOutOfClassDefLast` too.) I am not sure why is the `foo` used here (`B::F` can be imported instead).
I originally thought I did not need `foo` either but I could get it to import the definition of `B::f()` any other way.

I also saw similar behavior with `clang-import-test` where I need an expression that included something like `foo()` in order to obtain the out-of-line definition. It is not obvious to me why.

So in this case if I switch to using `BFP` instead of `FooDef` then this fails:

    auto *ToBFOutOfClass = FirstDeclMatcher<CXXMethodDecl>().match(
      ToTU, cxxMethodDecl(hasName("f"), isDefinition()));




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

https://reviews.llvm.org/D56936





More information about the cfe-commits mailing list