[PATCH] D136886: [ASTImporter] RFC: Correct importer to not duplicate sugared types

Vince Bridgers via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 27 14:10:13 PDT 2022


vabridgers created this revision.
vabridgers added a reviewer: mizvekov.
Herald added a reviewer: a.sidorin.
Herald added a reviewer: shafik.
Herald added a project: All.
vabridgers requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

I'm not sure if this is a "correct" fix, but this change fixes the added
Unit test case in ASTImporterTest.cpp.

The change 69a6417406a1 <https://reviews.llvm.org/rG69a6417406a1b0316a1fa6aeb63339d0e1d2abbd> - "[clang] Implement divergence for TypedefType
and UsingType", introduces a problem we've seen when the AST Importer is
used to import a sugared type with more than one level of syntactic
sugar.

The type va_list is imported like so

TypedefType 0x4a89410 'va_list' sugar

| -Typedef 0x4a891d0 'va_list' |
|

`-ElaboratedType 0x4a2d420 '__builtin_va_list' sugar

  `-TypedefType 0x4a2d3f0 '__builtin_va_list' sugar
    |-Typedef 0x4a2d398 '__builtin_va_list'
    `-ConstantArrayType 0x4a2d340 'struct __va_list_tag[1]' 1
      `-RecordType 0x4a2d180 'struct __va_list_tag'
        `-Record 0x4a2d0f8 '__va_list_tag'

and when "desugar" is used, comes back as follows.

VisitTypedefType T - desugared
ElaboratedType 0x4a2d420 '__builtin_va_list' sugar
`-TypedefType 0x4a2d3f0 '__builtin_va_list' sugar

  |-Typedef 0x4a2d398 '__builtin_va_list'
  `-ConstantArrayType 0x4a2d340 'struct __va_list_tag[1]' 1
    `-RecordType 0x4a2d180 'struct __va_list_tag'
      `-Record 0x4a2d0f8 '__va_list_tag'

So it appears the type must be desugared past the TypedefType to the
ElaboratedType, subsequently to the ConstantArrayType.

@mizvekov, could you please review this change and suggest different
approaches if this was not your intent?

This change seems to pass current Unit tests and LITs.

@mizvekov, if you wish to pick this up and finish, the UnitTest case
should be all you need for what we see.

Thanks


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D136886

Files:
  clang/lib/AST/ASTImporter.cpp
  clang/unittests/AST/ASTImporterTest.cpp


Index: clang/unittests/AST/ASTImporterTest.cpp
===================================================================
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -8075,6 +8075,36 @@
   EXPECT_FALSE(SharedStatePtr->isNewDecl(ToBar));
 }
 
+TEST_P(ASTImporterOptionSpecificTestBase, isSugaredImport) {
+  Decl *FromTU = getTuDecl(
+      R"(
+      typedef __builtin_va_list va_list;
+      void dbgout(char* fmt, ...)
+      {
+        va_list va;
+      } 
+      )",
+      Lang_C99);
+  Decl *ToTU = getToTuDecl(
+      R"(
+      typedef __builtin_va_list va_list;
+      void dbgout(char* fmt, ...);
+      void maindbgout(char* str)
+      {
+        dbgout((char*)str);
+      }
+      )",
+      Lang_C99);
+  auto *FromOther = FirstDeclMatcher<FunctionDecl>().match(
+      FromTU, functionDecl(hasName("dbgout")));
+  ASSERT_TRUE(FromOther);
+
+  auto *ToOther = Import(FromOther, Lang_C99);
+  ASSERT_TRUE(ToOther);
+
+  // EXPECT_TRUE(SharedStatePtr->isSugaredImport(ToOther));
+}
+
 INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest,
                          DefaultTestValuesForRunOptions);
 
Index: clang/lib/AST/ASTImporter.cpp
===================================================================
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -1358,7 +1358,9 @@
   Expected<TypedefNameDecl *> ToDeclOrErr = import(T->getDecl());
   if (!ToDeclOrErr)
     return ToDeclOrErr.takeError();
-  ExpectedType ToUnderlyingTypeOrErr = import(T->desugar());
+  // ExpectedType ToUnderlyingTypeOrErr = import(T->desugar());
+  ExpectedType ToUnderlyingTypeOrErr =
+      import(QualType(T, 0).getDesugaredType(T->getDecl()->getASTContext()));
   if (!ToUnderlyingTypeOrErr)
     return ToUnderlyingTypeOrErr.takeError();
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D136886.471294.patch
Type: text/x-patch
Size: 1819 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221027/68d953f4/attachment.bin>


More information about the cfe-commits mailing list