Skip to content

Commit 296cc1b

Browse files
[clangd] [AST] Handle uninitialized type constraints
The ASTWriter currently assumes template type constraints to be initialized ((bool)getTypeConstraint() == hasTypeConstraint()). The attached test case presents a scenario where that is not the case. This patch removes the assumption and adds another boolean to the serialization, to explicitly encode whether the type constraint has been initialized. Fixes #99036. Fixes #109354.
1 parent 26df43f commit 296cc1b

File tree

3 files changed

+33
-3
lines changed

3 files changed

+33
-3
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# RUN: rm -rf %t
2+
# RUN: mkdir -p %t
3+
# RUN: split-file %s %t
4+
#
5+
# RUN: not clangd --check=%t/main.cpp 2>&1 | FileCheck -strict-whitespace %s
6+
#
7+
# CHECK: Loaded compilation database
8+
# CHECK-NEXT: Compile command inferred from main.cpp is:
9+
# CHECK: Indexing headers...
10+
# CHECK-NEXT: [unknown_typename] Line 1: in included file: unknown type name '_Up'
11+
# CHECK: All checks completed, 1 errors
12+
13+
#--- header.h
14+
template<_Up>
15+
concept __decayed_same_as;
16+
template<__decayed_same_as>
17+
partial_ordering operator0
18+
19+
#--- main.cpp
20+
#include "header.h"
21+
22+
#--- compile_commands.json
23+
[
24+
{
25+
"directory": "/",
26+
"command": "c++ -std=c++20",
27+
"file": "main.cpp"
28+
}
29+
]

clang/lib/Serialization/ASTReaderDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2674,7 +2674,7 @@ void ASTDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
26742674

26752675
D->setDeclaredWithTypename(Record.readInt());
26762676

2677-
if (D->hasTypeConstraint()) {
2677+
if (Record.readBool() && D->hasTypeConstraint()) {
26782678
ConceptReference *CR = nullptr;
26792679
if (Record.readBool())
26802680
CR = Record.readConceptReference();

clang/lib/Serialization/ASTWriterDecl.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1899,7 +1899,7 @@ void ASTDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
18991899
Record.push_back(D->wasDeclaredWithTypename());
19001900

19011901
const TypeConstraint *TC = D->getTypeConstraint();
1902-
assert((bool)TC == D->hasTypeConstraint());
1902+
Record.push_back(TC != nullptr); // reflects TypeConstraintInitialized
19031903
if (TC) {
19041904
auto *CR = TC->getConceptReference();
19051905
Record.push_back(CR != nullptr);
@@ -1917,7 +1917,7 @@ void ASTDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
19171917
if (OwnsDefaultArg)
19181918
Record.AddTemplateArgumentLoc(D->getDefaultArgument());
19191919

1920-
if (!TC && !OwnsDefaultArg &&
1920+
if (!D->hasTypeConstraint() && !OwnsDefaultArg &&
19211921
D->getDeclContext() == D->getLexicalDeclContext() &&
19221922
!D->isInvalidDecl() && !D->hasAttrs() &&
19231923
!D->isTopLevelDeclInObjCContainer() && !D->isImplicit() &&
@@ -2580,6 +2580,7 @@ void ASTWriter::WriteDeclAbbrevs() {
25802580
// TemplateTypeParmDecl
25812581
Abv->Add(
25822582
BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // wasDeclaredWithTypename
2583+
Abv->Add(BitCodeAbbrevOp(0)); // TypeConstraintInitialized
25832584
Abv->Add(BitCodeAbbrevOp(0)); // OwnsDefaultArg
25842585
DeclTemplateTypeParmAbbrev = Stream.EmitAbbrev(std::move(Abv));
25852586

0 commit comments

Comments
 (0)