File tree Expand file tree Collapse file tree 3 files changed +24
-3
lines changed Expand file tree Collapse file tree 3 files changed +24
-3
lines changed Original file line number Diff line number Diff line change @@ -658,6 +658,26 @@ TEST(ClangdAST, PreferredIncludeDirective) {
658
658
Symbol::IncludeDirective::Import);
659
659
}
660
660
661
+ TEST (ClangdAST, HandleUninitializedTypeConstraints) {
662
+ auto TU = TestTU::withHeaderCode (R"cpp(
663
+ template<typename T>
664
+ concept C; // error-ok
665
+ template<C U>
666
+ void f();
667
+ )cpp" );
668
+ TU.ExtraArgs .push_back (" -std=c++20" );
669
+
670
+ auto AST = TU.build ();
671
+
672
+ const auto &F = llvm::cast<FunctionTemplateDecl>(findDecl (AST, " f" ));
673
+ const auto *Params = F.getTemplateParameters ();
674
+ const auto *U = llvm::cast<TemplateTypeParmDecl>(Params->getParam (0 ));
675
+ const auto *TC = U->getTypeConstraint ();
676
+
677
+ EXPECT_TRUE (U->hasTypeConstraint ());
678
+ EXPECT_FALSE (/* TypeConstraintInitialized=*/ TC != nullptr );
679
+ }
680
+
661
681
} // namespace
662
682
} // namespace clangd
663
683
} // namespace clang
Original file line number Diff line number Diff line change @@ -2674,7 +2674,7 @@ void ASTDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
2674
2674
2675
2675
D->setDeclaredWithTypename (Record.readInt ());
2676
2676
2677
- if (D->hasTypeConstraint ()) {
2677
+ if (Record. readBool () && D->hasTypeConstraint ()) {
2678
2678
ConceptReference *CR = nullptr ;
2679
2679
if (Record.readBool ())
2680
2680
CR = Record.readConceptReference ();
Original file line number Diff line number Diff line change @@ -1899,7 +1899,7 @@ void ASTDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
1899
1899
Record.push_back (D->wasDeclaredWithTypename ());
1900
1900
1901
1901
const TypeConstraint *TC = D->getTypeConstraint ();
1902
- assert (( bool ) TC == D-> hasTypeConstraint () );
1902
+ Record. push_back ( /* TypeConstraintInitialized= */ TC != nullptr );
1903
1903
if (TC) {
1904
1904
auto *CR = TC->getConceptReference ();
1905
1905
Record.push_back (CR != nullptr );
@@ -1917,7 +1917,7 @@ void ASTDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
1917
1917
if (OwnsDefaultArg)
1918
1918
Record.AddTemplateArgumentLoc (D->getDefaultArgument ());
1919
1919
1920
- if (!TC && !OwnsDefaultArg &&
1920
+ if (!D-> hasTypeConstraint () && !OwnsDefaultArg &&
1921
1921
D->getDeclContext () == D->getLexicalDeclContext () &&
1922
1922
!D->isInvalidDecl () && !D->hasAttrs () &&
1923
1923
!D->isTopLevelDeclInObjCContainer () && !D->isImplicit () &&
@@ -2580,6 +2580,7 @@ void ASTWriter::WriteDeclAbbrevs() {
2580
2580
// TemplateTypeParmDecl
2581
2581
Abv->Add (
2582
2582
BitCodeAbbrevOp (BitCodeAbbrevOp::Fixed, 1 )); // wasDeclaredWithTypename
2583
+ Abv->Add (BitCodeAbbrevOp (0 )); // TypeConstraintInitialized
2583
2584
Abv->Add (BitCodeAbbrevOp (0 )); // OwnsDefaultArg
2584
2585
DeclTemplateTypeParmAbbrev = Stream.EmitAbbrev (std::move (Abv));
2585
2586
You can’t perform that action at this time.
0 commit comments