llvm-project/clang/lib/AST
Gabor Marton a5e6590b15 [ASTImporter] Support CXXDeductionGuideDecl with local typedef
CXXDeductionGuideDecl with a local typedef has its own copy of the
TypedefDecl with the CXXDeductionGuideDecl as the DeclContext of that
TypedefDecl.
```
      template <typename T> struct A {
        typedef T U;
        A(U, T);
      };
      A a{(int)0, (int)0};
```
Related discussion on cfe-dev:
http://lists.llvm.org/pipermail/cfe-dev/2020-November/067252.html

Without this fix, when we import the CXXDeductionGuideDecl (via
VisitFunctionDecl) then before creating the Decl we must import the
FunctionType. However, the first parameter's type is the afore mentioned
local typedef. So, we then start importing the TypedefDecl whose
DeclContext is the CXXDeductionGuideDecl itself. The infinite loop is
formed.
```
 #0 clang::ASTNodeImporter::VisitCXXDeductionGuideDecl(clang::CXXDeductionGuideDecl*) clang/lib/AST/ASTImporter.cpp:3543:0
 #1 clang::declvisitor::Base<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Decl*> >::Visit(clang::Decl*) /home/egbomrt/WORK/llvm5/build/debug/tools/clang/include/clang/AST/DeclNodes.inc:405:0
 #2 clang::ASTImporter::ImportImpl(clang::Decl*) clang/lib/AST/ASTImporter.cpp:8038:0
 #3 clang::ASTImporter::Import(clang::Decl*) clang/lib/AST/ASTImporter.cpp:8200:0
 #4 clang::ASTImporter::ImportContext(clang::DeclContext*) clang/lib/AST/ASTImporter.cpp:8297:0
 #5 clang::ASTNodeImporter::ImportDeclContext(clang::Decl*, clang::DeclContext*&, clang::DeclContext*&) clang/lib/AST/ASTImporter.cpp:1852:0
 #6 clang::ASTNodeImporter::ImportDeclParts(clang::NamedDecl*, clang::DeclContext*&, clang::DeclContext*&, clang::DeclarationName&, clang::NamedDecl*&, clang::SourceLocation&) clang/lib/AST/ASTImporter.cpp:1628:0
 #7 clang::ASTNodeImporter::VisitTypedefNameDecl(clang::TypedefNameDecl*, bool) clang/lib/AST/ASTImporter.cpp:2419:0
 #8 clang::ASTNodeImporter::VisitTypedefDecl(clang::TypedefDecl*) clang/lib/AST/ASTImporter.cpp:2500:0
 #9 clang::declvisitor::Base<std::add_pointer, clang::ASTNodeImporter, llvm::Expected<clang::Decl*> >::Visit(clang::Decl*) /home/egbomrt/WORK/llvm5/build/debug/tools/clang/include/clang/AST/DeclNodes.inc:315:0
 #10 clang::ASTImporter::ImportImpl(clang::Decl*) clang/lib/AST/ASTImporter.cpp:8038:0
 #11 clang::ASTImporter::Import(clang::Decl*) clang/lib/AST/ASTImporter.cpp:8200:0
 #12 llvm::Expected<clang::TypedefNameDecl*> clang::ASTNodeImporter::import<clang::TypedefNameDecl>(clang::TypedefNameDecl*) clang/lib/AST/ASTImporter.cpp:165:0
 #13 clang::ASTNodeImporter::VisitTypedefType(clang::TypedefType const*) clang/lib/AST/ASTImporter.cpp:1304:0
 #14 clang::TypeVisitor<clang::ASTNodeImporter, llvm::Expected<clang::QualType> >::Visit(clang::Type const*) /home/egbomrt/WORK/llvm5/build/debug/tools/clang/include/clang/AST/TypeNodes.inc:74:0
 #15 clang::ASTImporter::Import(clang::QualType) clang/lib/AST/ASTImporter.cpp:8071:0
 #16 llvm::Expected<clang::QualType> clang::ASTNodeImporter::import<clang::QualType>(clang::QualType const&) clang/lib/AST/ASTImporter.cpp:179:0
 #17 clang::ASTNodeImporter::VisitFunctionProtoType(clang::FunctionProtoType const*) clang/lib/AST/ASTImporter.cpp:1244:0
 #18 clang::TypeVisitor<clang::ASTNodeImporter, llvm::Expected<clang::QualType> >::Visit(clang::Type const*) /home/egbomrt/WORK/llvm5/build/debug/tools/clang/include/clang/AST/TypeNodes.inc:47:0
 #19 clang::ASTImporter::Import(clang::QualType) clang/lib/AST/ASTImporter.cpp:8071:0
 #20 llvm::Expected<clang::QualType> clang::ASTNodeImporter::import<clang::QualType>(clang::QualType const&) clang/lib/AST/ASTImporter.cpp:179:0
 #21 clang::QualType clang::ASTNodeImporter::importChecked<clang::QualType>(llvm::Error&, clang::QualType const&) clang/lib/AST/ASTImporter.cpp:198:0
 #22 clang::ASTNodeImporter::VisitFunctionDecl(clang::FunctionDecl*) clang/lib/AST/ASTImporter.cpp:3313:0
 #23 clang::ASTNodeImporter::VisitCXXDeductionGuideDecl(clang::CXXDeductionGuideDecl*) clang/lib/AST/ASTImporter.cpp:3543:0
```

The fix is to first create the TypedefDecl and only then start to import
the DeclContext.
Basically, we could do this during the import of all other Decls (not
just for typedefs). But it seems, there is only one another AST
construct that has a similar cycle: a struct defined as a function
parameter:
```
int struct_in_proto(struct data_t{int a;int b;} *d);

```
In that case, however, we had decided to return simply with an error
back then because that seemed to be a very rare construct.

Differential Revision: https://reviews.llvm.org/D92209
2020-12-09 21:25:04 +01:00
..
Interp [clang][NFC] Use SmallString instead of SmallVector<char 2020-11-17 13:02:58 +00:00
APValue.cpp ADT: Stop peeking inside AlignedCharArrayUnion, NFC 2020-12-04 11:07:42 -08:00
ASTConcept.cpp
ASTConsumer.cpp
ASTContext.cpp PR48434: Work around crashes due to deserialization cycles via typedefs. 2020-12-09 12:22:35 -08:00
ASTDiagnostic.cpp [c++20] For P0732R2 / P1907R1: Basic frontend support for class types as 2020-10-21 13:21:41 -07:00
ASTDumper.cpp Undo Revert "Ignore template instantiations if not in AsIs mode" 2020-11-03 13:59:01 -08:00
ASTImporter.cpp [ASTImporter] Support CXXDeductionGuideDecl with local typedef 2020-12-09 21:25:04 +01:00
ASTImporterLookupTable.cpp [ASTImporter] Add Visitor for TypedefNameDecl's 2020-07-28 11:52:29 -05:00
ASTStructuralEquivalence.cpp [ASTImporter][AST] Fix structural equivalency crash on dependent FieldDecl 2020-10-05 14:06:09 +02:00
ASTTypeTraits.cpp [clang] Allow DynTypedNode to store a TemplateArgumentLoc 2020-08-10 03:09:18 -04:00
AttrImpl.cpp [OPENMP]Fix PR47158, case 3: allow devic_typein nested declare target region. 2020-08-24 09:58:37 -04:00
CMakeLists.txt [Ignore Expressions] Fix performance regression by inlining `Ignore*SingleStep` 2020-09-09 07:32:40 +00:00
CXXABI.h
CXXInheritance.cpp Remove CXXBasePaths::found_decls and simplify and modernize its only 2020-12-01 16:35:03 -08:00
Comment.cpp
CommentBriefParser.cpp
CommentCommandTraits.cpp
CommentLexer.cpp [clang][NFC] Rearrange Comment Token and Lexer fields to reduce padding 2020-10-27 00:03:43 +00:00
CommentParser.cpp
CommentSema.cpp [AST] Remove DeclCXX.h dep on ASTContext.h 2020-04-06 10:09:01 -07:00
ComparisonCategories.cpp Revert "Revert "Ensure that checkInitIsICE is called exactly once for every variable"" 2020-10-26 12:08:57 -07:00
ComputeDependence.cpp PR47175: Ensure type-dependent function-style casts have dependent 2020-10-08 17:00:22 -07:00
DataCollection.cpp
Decl.cpp Convert ConstexprKind from Specifiers.h to a scoped enum; NFC 2020-11-16 14:10:19 -05:00
DeclBase.cpp [c++20] For P0732R2 / P1907R1: Basic frontend support for class types as 2020-10-21 13:21:41 -07:00
DeclCXX.cpp Convert ConstexprKind from Specifiers.h to a scoped enum; NFC 2020-11-16 14:10:19 -05:00
DeclFriend.cpp
DeclGroup.cpp
DeclObjC.cpp [AST] Fix crashes caused by redeclarations in hidden prototypes 2020-10-08 19:48:36 -07:00
DeclOpenMP.cpp [OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation. 2020-08-06 12:25:19 -04:00
DeclPrinter.cpp [clang][NFC] DeclPrinter: use NamedDecl::getDeclName instead of NamedDecl::printName to print the name of enumerations, namespaces and template parameters. 2020-08-05 13:54:38 +01:00
DeclTemplate.cpp Suppress printing template arguments that match default template 2020-11-11 15:05:51 -08:00
DeclarationName.cpp
Expr.cpp Fix assertion failure due to incorrect dependence bits on a DeclRefExpr 2020-12-07 18:48:38 -08:00
ExprCXX.cpp PR45699: Fix crash if an unexpanded parameter pack appears in a 2020-12-03 15:26:06 -08:00
ExprClassification.cpp [c++20] For P0732R2 / P1907R1: Basic frontend support for class types as 2020-10-21 13:21:41 -07:00
ExprConcepts.cpp
ExprConstant.cpp [AST] Enhance the const expression evaluator to support error-dependent exprs. 2020-11-18 15:48:06 +01:00
ExprObjC.cpp
ExternalASTMerger.cpp
ExternalASTSource.cpp
FormatString.cpp [Sema] Emit a -Wformat warning for printf("%s", (void*)p) 2020-07-10 15:10:24 -04:00
FormatStringParsing.h
InheritViz.cpp
ItaniumCXXABI.cpp
ItaniumMangle.cpp Treat a placeholder type for class template argument deduction as 2020-11-24 16:59:06 -08:00
JSONNodeDumper.cpp [clang][NFC] Use SmallString instead of SmallVector<char 2020-11-17 13:02:58 +00:00
Linkage.h [c++20] For P0732R2 / P1907R1: Basic code generation and name 2020-11-09 22:10:27 -08:00
Mangle.cpp Fix a variety of minor issues with ObjC method mangling: 2020-09-29 19:51:53 -04:00
MicrosoftCXXABI.cpp
MicrosoftMangle.cpp Update MS ABI mangling for union constants based on new information from 2020-12-02 12:17:52 -08:00
NSAPI.cpp [Clang][PowerPC] Add __vector_pair and __vector_quad types 2020-10-28 13:19:20 -05:00
NestedNameSpecifier.cpp [AST][RecoveryExpr] Avoid spurious 'missing typename' diagnostic when the NNS contains errors. 2020-06-30 16:18:32 +02:00
ODRHash.cpp [ODRHash] Remove use of 'whitelist'. 2020-06-19 18:39:30 -07:00
OSLog.cpp [clang][NFC] Add 'override' keyword to virtual function overrides 2020-07-14 08:59:57 -07:00
OpenMPClause.cpp [OpenMP][FIX] Do not drop a '$' while demangling declare variant names 2020-09-16 13:37:09 -05:00
ParentMap.cpp
ParentMapContext.cpp Remove the IgnoreImplicitCastsAndParentheses traversal kind 2020-11-23 14:27:48 +00:00
PrintfFormatString.cpp [Clang][PowerPC] Add __vector_pair and __vector_quad types 2020-10-28 13:19:20 -05:00
QualTypeNames.cpp
RawCommentList.cpp [clang] fix undefined behaviour in RawComment::getFormattedText() 2020-04-06 10:48:25 +02:00
RecordLayout.cpp [AIX] Implement AIX special alignment rule about double/long double 2020-07-27 15:13:03 -04:00
RecordLayoutBuilder.cpp [AST] Change return type of getTypeInfoInChars to a proper struct instead of std::pair. 2020-10-13 13:26:56 +02:00
ScanfFormatString.cpp
SelectorLocationsKind.cpp
Stmt.cpp [X86] Add support for vex, vex2, vex3, and evex for MASM 2020-11-20 16:20:19 +08:00
StmtCXX.cpp
StmtIterator.cpp
StmtObjC.cpp
StmtOpenMP.cpp [OPENMP]Redesign of OMPExecutableDirective/OMPDeclarativeDirective representation. 2020-08-06 12:25:19 -04:00
StmtPrinter.cpp [c++20] For P0732R2 / P1907R1: Basic frontend support for class types as 2020-10-21 13:21:41 -07:00
StmtProfile.cpp [OPENMP50]Codegen for inscan reductions in worksharing directives. 2020-06-04 16:29:33 -04:00
StmtViz.cpp
TemplateBase.cpp Fix structural comparison of template template arguments to compare the 2020-11-11 19:15:21 -08:00
TemplateName.cpp [NFC] Refactor DiagnosticBuilder and PartialDiagnostic 2020-10-19 17:48:04 -04:00
TextNodeDumper.cpp [FPEnv] Evaluate constant expressions under non-default rounding modes 2020-09-26 17:59:39 +07:00
Type.cpp PR48434: Work around crashes due to deserialization cycles via typedefs. 2020-12-09 12:22:35 -08:00
TypeLoc.cpp [Clang][PowerPC] Add __vector_pair and __vector_quad types 2020-10-28 13:19:20 -05:00
TypePrinter.cpp Add new 'preferred_name' attribute. 2020-12-09 12:22:35 -08:00
VTTBuilder.cpp
VTableBuilder.cpp [c++20] consteval functions don't get vtable slots. 2020-06-30 18:22:09 -07:00