tree c778147a1f4b502ad55011d864cc16ede138e812
parent 4180ffe0fd9c740f1993e2070e5c79742e41b6bb
author Lukasz Anforowicz <lukasza@google.com> 1654790922 -0700
committer Copybara-Service <copybara-worker@google.com> 1654790953 -0700

Fixing infinite recursion in ConvertTemplateSpecializationType.

Before this CL, a class template with a member function that
refers back to the same class ...

```cpp
    template <typename T>
    struct MyTemplate {
      void MyMethod(const MyTemplate<T>& other) const {}
    };
    using MyTypeAlias = MyTemplate<int>;
```

... would cause an infinite recursion:

```txt
    ...
    Importer::ConvertTemplateSpecializationType() <- importing MyTemplate<int>
    Importer::ConvertType() at importer.cc:746:12
    Importer::ConvertQualType() at importer.cc:767:7
    Importer::ConvertType() at importer.cc:694:5
    Importer::ConvertQualType() at importer.cc:767:7
    FunctionDeclImporter::Import() at function.cc:69:29 <- importing MyMethod
    DeclImporterBase<clang::FunctionDecl>::ImportDecl() ...
    Importer::ImportDecl() at importer.cc:461:26
    Importer::GetDeclItem() at importer.cc:452:38
    Importer::GetItemIdsInSourceOrder() at importer.cc:331:9
    CXXRecordDeclImporter::Import() at cxx_record.cc:137:25
    DeclImporterBase<clang::CXXRecordDecl>::ImportDecl() ...
    Importer::ImportDecl() at importer.cc:461:26
    Importer::GetDeclItem() at importer.cc:452:38
    Importer::ConvertTemplateSpecializationType() <- importing MyTemplate<int>
    ...
```

The problem above was introduced in https://github.com/google/crubit/commit/14732b2920053fadd06917ffd9201cd6d64704ff which started to call
ConvertTemplateSpecializationType from ConvertType (rather than from
TypedefNameDeclImporter::Import which won't be recursively reentered
in this scenario).

This CL prevents the infinite recursion by checking `known_types_` to
check if the `ClassTemplateSpecializationDecl` has been already
processed before.

Interestingly, I've wondered about the infinite recursion before, but
dismissed this problem, because I thought that it is sufficiently tested
via `this` parameter of instance methods (which already had some test
coverage).  It turned out that this coverage is insufficient, because
`method_decl->getThisType()` doesn't use `TemplateSpecializationType`.

PiperOrigin-RevId: 453939417
