Skip to content

Commit 20042cc

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 5df7d88 commit 20042cc

File tree

3 files changed

+34
-3
lines changed

3 files changed

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

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)