Skip to content

Commit 51815b1

Browse files
[Clang][ASTImporter] Implement AST import for CXXParenListInitExpr, SubstNonTypeTemplateParmPackExpr, PseudoObjectExpr (llvm#160904)
Add new visit functions to ASTImporter for CXXParenListInitExpr, SubstNonTypeTemplateParmPackExpr and PseudoObjectExpr. On CTU analysis there are lot of "cannot import unsupported AST node" for CXXParenListInitExpr, SubstNonTypeTemplateParmPackExpr and PseudoObjectExpr. Problem occurred after full support of Concepts in importer.
1 parent cd68056 commit 51815b1

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

clang/lib/AST/ASTImporter.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,10 @@ namespace clang {
696696
ExpectedStmt VisitCXXFoldExpr(CXXFoldExpr *E);
697697
ExpectedStmt VisitRequiresExpr(RequiresExpr* E);
698698
ExpectedStmt VisitConceptSpecializationExpr(ConceptSpecializationExpr* E);
699+
ExpectedStmt
700+
VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr *E);
701+
ExpectedStmt VisitPseudoObjectExpr(PseudoObjectExpr *E);
702+
ExpectedStmt VisitCXXParenListInitExpr(CXXParenListInitExpr *E);
699703

700704
// Helper for chaining together multiple imports. If an error is detected,
701705
// subsequent imports will return default constructed nodes, so that failure
@@ -9273,6 +9277,50 @@ ASTNodeImporter::VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) {
92739277
const_cast<ImplicitConceptSpecializationDecl *>(CSD), &Satisfaction);
92749278
}
92759279

9280+
ExpectedStmt ASTNodeImporter::VisitSubstNonTypeTemplateParmPackExpr(
9281+
SubstNonTypeTemplateParmPackExpr *E) {
9282+
Error Err = Error::success();
9283+
auto ToType = importChecked(Err, E->getType());
9284+
auto ToPackLoc = importChecked(Err, E->getParameterPackLocation());
9285+
auto ToArgPack = importChecked(Err, E->getArgumentPack());
9286+
auto ToAssociatedDecl = importChecked(Err, E->getAssociatedDecl());
9287+
if (Err)
9288+
return std::move(Err);
9289+
9290+
return new (Importer.getToContext()) SubstNonTypeTemplateParmPackExpr(
9291+
ToType, E->getValueKind(), ToPackLoc, ToArgPack, ToAssociatedDecl,
9292+
E->getIndex(), E->getFinal());
9293+
}
9294+
9295+
ExpectedStmt ASTNodeImporter::VisitPseudoObjectExpr(PseudoObjectExpr *E) {
9296+
SmallVector<Expr *, 4> ToSemantics(E->getNumSemanticExprs());
9297+
if (Error Err = ImportContainerChecked(E->semantics(), ToSemantics))
9298+
return std::move(Err);
9299+
auto ToSyntOrErr = import(E->getSyntacticForm());
9300+
if (!ToSyntOrErr)
9301+
return ToSyntOrErr.takeError();
9302+
return PseudoObjectExpr::Create(Importer.getToContext(), *ToSyntOrErr,
9303+
ToSemantics, E->getResultExprIndex());
9304+
}
9305+
9306+
ExpectedStmt
9307+
ASTNodeImporter::VisitCXXParenListInitExpr(CXXParenListInitExpr *E) {
9308+
Error Err = Error::success();
9309+
auto ToType = importChecked(Err, E->getType());
9310+
auto ToInitLoc = importChecked(Err, E->getInitLoc());
9311+
auto ToBeginLoc = importChecked(Err, E->getBeginLoc());
9312+
auto ToEndLoc = importChecked(Err, E->getEndLoc());
9313+
if (Err)
9314+
return std::move(Err);
9315+
9316+
SmallVector<Expr *, 4> ToArgs(E->getInitExprs().size());
9317+
if (Error Err = ImportContainerChecked(E->getInitExprs(), ToArgs))
9318+
return std::move(Err);
9319+
return CXXParenListInitExpr::Create(Importer.getToContext(), ToArgs, ToType,
9320+
E->getUserSpecifiedInitExprs().size(),
9321+
ToInitLoc, ToBeginLoc, ToEndLoc);
9322+
}
9323+
92769324
Error ASTNodeImporter::ImportOverriddenMethods(CXXMethodDecl *ToMethod,
92779325
CXXMethodDecl *FromMethod) {
92789326
Error ImportErrors = Error::success();

clang/unittests/AST/ASTImporterTest.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3300,6 +3300,72 @@ TEST_P(ImportExpr, ConceptNestedNonInstantiationDependentRequirement) {
33003300
conceptDecl(has(requiresExpr(has(requiresExprBodyDecl())))));
33013301
}
33023302

3303+
TEST_P(ImportExpr, ImportSubstNonTypeTemplateParmPackExpr) {
3304+
MatchVerifier<Decl> Verifier;
3305+
const char *Code = R"(
3306+
template<auto ...> struct X {};
3307+
template<typename ...> struct Z {};
3308+
3309+
template<int ...N> struct E {
3310+
template<int ...M> using B = Z<X<N, M>...>;
3311+
template<int M1, int M2> E(B<M1, M2>);
3312+
};
3313+
using declToImport = E<1, 3>;
3314+
)";
3315+
testImport(Code, Lang_CXX20, "", Lang_CXX20, Verifier,
3316+
typedefNameDecl(hasName("declToImport")));
3317+
}
3318+
3319+
TEST_P(ImportExpr, ImportCXXParenListInitExpr) {
3320+
MatchVerifier<Decl> Verifier;
3321+
const char *Code = R"(
3322+
struct Node {
3323+
int val;
3324+
double d;
3325+
};
3326+
Node* declToImport() { return new Node(2, 3.14); }
3327+
)";
3328+
testImport(Code, Lang_CXX20, "", Lang_CXX20, Verifier,
3329+
functionDecl(hasName("declToImport")));
3330+
}
3331+
3332+
TEST_P(ImportExpr, ImportPseudoObjectExpr) {
3333+
MatchVerifier<Decl> Verifier;
3334+
const char *Code = R"(
3335+
namespace std {
3336+
struct strong_ordering {
3337+
int n;
3338+
constexpr operator int() const { return n; }
3339+
static const strong_ordering less, equal, greater;
3340+
};
3341+
constexpr strong_ordering strong_ordering::less{-1},
3342+
strong_ordering::equal{0}, strong_ordering::greater{1};
3343+
}
3344+
3345+
struct A {
3346+
std::strong_ordering operator<=>(const A&) const;
3347+
};
3348+
struct B {
3349+
bool operator==(const B&) const;
3350+
bool operator<(const B&) const;
3351+
};
3352+
3353+
template<typename T> struct Cmp : T {
3354+
std::strong_ordering operator<=>(const Cmp&) const = default;
3355+
};
3356+
3357+
void use(...);
3358+
void declToImport() {
3359+
use(
3360+
Cmp<A>() <=> Cmp<A>(),
3361+
Cmp<B>() <=> Cmp<B>()
3362+
);
3363+
}
3364+
)";
3365+
testImport(Code, Lang_CXX20, "", Lang_CXX20, Verifier,
3366+
functionDecl(hasName("declToImport")));
3367+
}
3368+
33033369
class ImportImplicitMethods : public ASTImporterOptionSpecificTestBase {
33043370
public:
33053371
static constexpr auto DefaultCode = R"(

0 commit comments

Comments
 (0)