[PATCH] D92101: [Clang][Sema] Attempt to fix CTAD faulty copy of non-local typedefs
Gabor Marton via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 30 05:30:02 PST 2020
martong updated this revision to Diff 308335.
martong marked 2 inline comments as done.
martong added a comment.
- Check for dependent DeclContext
- Remove "dump()" calls from tests
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D92101/new/
https://reviews.llvm.org/D92101
Files:
clang/lib/Sema/SemaTemplate.cpp
clang/unittests/AST/ASTImporterTest.cpp
Index: clang/unittests/AST/ASTImporterTest.cpp
===================================================================
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -5884,6 +5884,54 @@
EXPECT_EQ(Record, CompletedTags.front());
}
+// FIXME Move these tests out of ASTImporterTest. For that we need to factor
+// out the ASTImporter specific pars from ASTImporterOptionSpecificTestBase
+// into a new test Fixture. Then we should lift up this Fixture to its own
+// implementation file and only then could we reuse the Fixture in other AST
+// unitttests.
+struct CTAD : ASTImporterOptionSpecificTestBase {};
+
+TEST_P(CTAD, DeductionGuideShouldReferToANonLocalTypedef) {
+ Decl *TU = getTuDecl(
+ R"(
+ typedef int U;
+ template <typename T> struct A {
+ A(U, T);
+ };
+ A a{(int)0, (int)0};
+ )",
+ Lang_CXX17, "input.cc");
+ auto *Guide = FirstDeclMatcher<CXXDeductionGuideDecl>().match(
+ TU, cxxDeductionGuideDecl());
+ auto *Typedef = FirstDeclMatcher<TypedefNameDecl>().match(
+ TU, typedefNameDecl(hasName("U")));
+ ParmVarDecl *Param = Guide->getParamDecl(0);
+ // The type of the first param (which is a typedef) should match the typedef
+ // in the global scope.
+ EXPECT_EQ(Param->getType()->getAs<TypedefType>()->getDecl(), Typedef);
+}
+
+TEST_P(CTAD, DeductionGuideShouldCopyALocalTypedef) {
+ Decl *TU = getTuDecl(
+ R"(
+ template <typename T> struct A {
+ typedef T U;
+ A(U, T);
+ };
+ A a{(int)0, (int)0};
+ )",
+ Lang_CXX17, "input.cc");
+ auto *Guide = FirstDeclMatcher<CXXDeductionGuideDecl>().match(
+ TU, cxxDeductionGuideDecl());
+ auto *Typedef = FirstDeclMatcher<TypedefNameDecl>().match(
+ TU, typedefNameDecl(hasName("U")));
+ ParmVarDecl *Param = Guide->getParamDecl(0);
+ EXPECT_NE(Param->getType()->getAs<TypedefType>()->getDecl(), Typedef);
+}
+
+INSTANTIATE_TEST_CASE_P(ParameterizedTests, CTAD,
+ DefaultTestValuesForRunOptions, );
+
INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest,
DefaultTestValuesForRunOptions, );
Index: clang/lib/Sema/SemaTemplate.cpp
===================================================================
--- clang/lib/Sema/SemaTemplate.cpp
+++ clang/lib/Sema/SemaTemplate.cpp
@@ -2350,6 +2350,15 @@
ParmVarDecl *OldParam, MultiLevelTemplateArgumentList &Args,
llvm::SmallVectorImpl<TypedefNameDecl *> &MaterializedTypedefs) {
TypeSourceInfo *OldDI = OldParam->getTypeSourceInfo();
+
+ if (auto *OldTypedefT = OldParam->getType()->getAs<TypedefType>()) {
+ TypedefNameDecl *OldTypedefDecl = OldTypedefT->getDecl();
+ // If the typedef does not have a dependent context then skip the
+ // transform.
+ if (!OldTypedefDecl->getDeclContext()->isDependentContext())
+ return OldParam;
+ }
+
TypeSourceInfo *NewDI;
if (auto PackTL = OldDI->getTypeLoc().getAs<PackExpansionTypeLoc>()) {
// Expand out the one and only element in each inner pack.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D92101.308335.patch
Type: text/x-patch
Size: 3102 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201130/b1c85215/attachment-0001.bin>
More information about the cfe-commits
mailing list