[cfe-dev] Isolated TypedefDecl in CXXDeductionGuideDecl parameter?

Aaron Ballman via cfe-dev cfe-dev at lists.llvm.org
Fri Nov 20 08:49:16 PST 2020


On Fri, Nov 20, 2020 at 11:30 AM Gábor Márton <martongabesz at gmail.com> wrote:
>
> Hi,
>
> Considering the below code:
> 01
> 02  struct A {};
> 03  typedef A AT;
> 04
> 05  template <typename T> struct ClassT {
> 06    ClassT(AT p0, T* p1) {}
> 07  };
> 08
> 09  A a;
> 10  int x;
> 11  auto y = ClassT(a, &x);
>
> The deduction guide's first parameter refers to a TypedefDecl that is isolated
> from the first TypedefDecl. First declaration:
>
> |-TypedefDecl 0x5555561eaec0 <line:3:3, col:13> col:13 referenced AT 'A'
> | `-RecordType 0x5555561ead80 'A'
> |   `-CXXRecord 0x5555561eacf0 'A'
>
> Vs the function prototype of the deduction guide refers to an isolated
> (out-of-the-redecl-chain) TypedefDecl:
>
> FunctionProtoType 0x55555621bc80 'auto (AT, T *) -> ClassT<T>' dependent trailing_return cdecl
> |-InjectedClassNameType 0x5555561eb220 'ClassT<T>' dependent
> | `-CXXRecord 0x5555561eafe0 'ClassT'
> |-TypedefType 0x55555621bb20 'AT' sugar
> | |-Typedef 0x55555621bac0 'AT'
> | `-RecordType 0x5555561ead80 'struct A'
> |   `-CXXRecord 0x5555561eacf0 'A'
> `-PointerType 0x5555561eb410 'T *' dependent
>   `-TemplateTypeParmType 0x5555561eafa0 'T' dependent depth 0 index 0
>     `-TemplateTypeParm 0x5555561eaf18 'T'
>
> So, in the translation unit, we have two distinct TypedefDecl AST nodes. The
> first one's DeclContext is the TranslationUnidDecl, however, the second's is
> the CXXDeductionGuideDecl.
>
> This is strange, because when dealing with regular function template
> instantiations, the two typedefs are the same and we have only one universal
> TypedefDecl node in the AST.
> 01
> 02  struct A {};
> 03  typedef A AT;
> 04
> 05  template <typename T>
> 06  int fun(AT p0, T* p1) {}
> 07
> 08  A a;
> 09  int x;
> 10  int y = fun(a, &x);
>
> TypedefDecl 0x5555561eaf70 <input.cc:3:3, col:13> col:13 referenced AT 'A'
> `-RecordType 0x5555561eae30 'A'
>   `-CXXRecord 0x5555561eada0 'A'
>
> FunctionProtoType 0x5555561eb240 'int (AT, T *)' dependent cdecl
> |-BuiltinType 0x5555561ab0a0 'int'
> |-TypedefType 0x5555561eb090 'AT' sugar
> | |-Typedef 0x5555561eaf70 'AT'
> | `-RecordType 0x5555561eae30 'struct A'
> |   `-CXXRecord 0x5555561eada0 'A'
> `-PointerType 0x5555561eb160 'T *' dependent
>   `-TemplateTypeParmType 0x5555561eb050 'T' dependent depth 0 index 0
>     `-TemplateTypeParm 0x5555561eafc8 'T'
>
> I was wondering whether this discrepancy is deliberate. IMO, the deduction
> guide should refer to the TypedefDecl in the TranslationUnidDecl and it should
> not create a new TypedefDecl. Can someone confirm if this is a bug or not?

I can't confirm that this behavior is a bug, but it certainly smells
like one to me. We use pointer comparisons to establish declaration
identity and that would fail with this (and this also gets used in
things like the JSON AST dumper). That said, I'm not certain why the
behavior is the way it is, so it's possible there's something deeper
going on here (but I'd argue it's still likely a bug).

~Aaron

>
> Context: I am trying to fix an infinite loop in the ASTImporter that is related
> to importing deduction guidelines.
>
> Any insight would be really appreciated.
>
> Thanks,
> Gabor
>


More information about the cfe-dev mailing list