Skip to content

Commit 03348cf

Browse files
authored
Add checked information for function declarations to AST reading and writing (#723)
* Write and read function decl checked and written checked scope specifiers * Use static_cast instead of C-style casts in ASTReaderStmt::VisitCompoundStmt * Add pch tests for function declarations with checked scope specifiers
1 parent fa06b6d commit 03348cf

5 files changed

Lines changed: 38 additions & 4 deletions

File tree

clang/lib/Serialization/ASTReaderDecl.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -861,6 +861,8 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
861861
// after everything else is read.
862862

863863
FD->setStorageClass(static_cast<StorageClass>(Record.readInt()));
864+
FD->setCheckedSpecifier(static_cast<CheckedScopeSpecifier>(Record.readInt()));
865+
FD->setWrittenCheckedSpecifier(static_cast<CheckedScopeSpecifier>(Record.readInt()));
864866
FD->setInlineSpecified(Record.readInt());
865867
FD->setImplicitlyInline(Record.readInt());
866868
FD->setExplicitSpecified(Record.readInt());

clang/lib/Serialization/ASTReaderStmt.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ void ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) {
161161
VisitStmt(S);
162162
SmallVector<Stmt *, 16> Stmts;
163163
unsigned NumStmts = Record.readInt();
164-
S->setCheckedSpecifiers((CheckedScopeSpecifier)Record.readInt());
165-
S->setWrittenCheckedSpecifiers((CheckedScopeSpecifier)Record.readInt());
164+
S->setCheckedSpecifiers(static_cast<CheckedScopeSpecifier>(Record.readInt()));
165+
S->setWrittenCheckedSpecifiers(static_cast<CheckedScopeSpecifier>(Record.readInt()));
166166
while (NumStmts--)
167167
Stmts.push_back(Record.readSubStmt());
168168
S->setStmts(Stmts);

clang/lib/Serialization/ASTWriterDecl.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,8 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
538538
// FunctionDecl's body is handled last at ASTWriterDecl::Visit,
539539
// after everything else is written.
540540
Record.push_back(static_cast<int>(D->getStorageClass())); // FIXME: stable encoding
541+
Record.push_back(D->getCheckedSpecifier());
542+
Record.push_back(D->getWrittenCheckedSpecifier());
541543
Record.push_back(D->isInlineSpecified());
542544
Record.push_back(D->isInlined());
543545
Record.push_back(D->isExplicitSpecified());
@@ -2130,6 +2132,8 @@ void ASTWriter::WriteDeclAbbrevs() {
21302132
// FunctionDecl
21312133
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 11)); // IDNS
21322134
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // StorageClass
2135+
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // CheckedScopeSpecifier
2136+
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 2)); // WrittenCheckedScopeSpecifier
21332137
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Inline
21342138
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InlineSpecified
21352139
Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ExplicitSpecified

clang/test/CheckedC/ast-dump-pch.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,26 @@
3434
// CHECK: _Unchecked
3535
// CHECK-NOT {{checking-state}}
3636

37-
// TODO: GitHub issue #704: add function declarations with checked scope specifiers
37+
// CHECK-NEXT: FunctionDecl
38+
// CHECK: f5
39+
// CHECK: checked
40+
// CHECK-NEXT: CompoundStmt
41+
// CHECK: checking-state bounds-and-types
42+
43+
// CHECK-NEXT: FunctionDecl
44+
// CHECK: f6
45+
// CHECK: checked bounds_only
46+
// CHECK-NEXT: CompoundStmt
47+
// CHECK: checking-state bounds
48+
49+
// CHECK-NEXT: FunctionDecl
50+
// CHECK: f7
51+
// CHECK: unchecked
52+
// CHECK-NEXT: CompoundStmt
53+
// CHECK-NOT: {{_Checked|_Unchecked|checking-state}}
54+
55+
// CHECK-NEXT: FunctionDecl
56+
// CHECK: f8
57+
// CHECK: checked
58+
// CHECK-NEXT: CompoundStmt
59+
// CHECK: checking-state bounds

clang/test/CheckedC/ast-dump-pch.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,10 @@ void f3(void) _Checked _Bounds_only {}
1313

1414
void f4(void) _Unchecked {}
1515

16-
// TODO: GitHub issue #704: add function declarations with checked scope specifiers
16+
_Checked void f5(void) {}
17+
18+
_Checked _Bounds_only void f6(void) {}
19+
20+
_Unchecked void f7(void) {}
21+
22+
_Checked void f8(void) _Checked _Bounds_only {}

0 commit comments

Comments
 (0)