Skip to content

Commit 14c3447

Browse files
committed
Merge branch 'dev' into dev-fixes
Bring in updates from Microsoft to allow for a clean PR.
2 parents 0641e8d + 71fc4c4 commit 14c3447

21 files changed

+186
-26
lines changed

include/clang/Basic/CodeGenOptions.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,9 @@ CODEGENOPT(BranchTargetEnforcement, 1, 0)
364364
/// Whether to emit unused static constants.
365365
CODEGENOPT(KeepStaticConsts, 1, 0)
366366

367+
/// Whether to add dynamic checks for null pointer arithmetic.
368+
CODEGENOPT(CheckedCNullPtrArith, 1, 1)
369+
367370
#undef CODEGENOPT
368371
#undef ENUM_CODEGENOPT
369372
#undef VALUE_CODEGENOPT

include/clang/Driver/Options.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2621,6 +2621,14 @@ def fintegrated_as : Flag<["-"], "fintegrated-as">, Flags<[DriverOption]>,
26212621
def fno_integrated_as : Flag<["-"], "fno-integrated-as">,
26222622
Flags<[CC1Option, DriverOption]>, Group<f_Group>,
26232623
HelpText<"Disable the integrated assembler">;
2624+
2625+
def fcheckedc_null_ptr_arith : Flag<["-"], "fcheckedc-null-ptr-arith">,
2626+
Group<f_Group>, Flags<[CC1Option]>,
2627+
HelpText<"Enable runtime null pointer arithmetic checks">;
2628+
def fno_checkedc_null_ptr_arith : Flag<["-"], "fno-checkedc-null-ptr-arith">,
2629+
Group<f_Group>, Flags<[CC1Option]>,
2630+
HelpText<"Disable runtime null pointer arithmetic checks">;
2631+
26242632
def : Flag<["-"], "integrated-as">, Alias<fintegrated_as>, Flags<[DriverOption]>;
26252633
def : Flag<["-"], "no-integrated-as">, Alias<fno_integrated_as>,
26262634
Flags<[CC1Option, DriverOption]>;

lib/CodeGen/CGDynamicCheck.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,38 @@ void CodeGenFunction::EmitExplicitDynamicCheck(const Expr *Condition) {
5656
// General Functions for inserting dynamic checks
5757
//
5858

59+
static bool shouldEmitNonNullCheck(const CodeGenModule &CGM,
60+
const QualType BaseTy) {
61+
if (!CGM.getLangOpts().CheckedC)
62+
return false;
63+
64+
if (!(BaseTy->isCheckedPointerType() || BaseTy->isCheckedArrayType()))
65+
return false;
66+
67+
return true;
68+
}
69+
5970
void CodeGenFunction::EmitDynamicNonNullCheck(const Address BaseAddr,
6071
const QualType BaseTy) {
61-
if (!getLangOpts().CheckedC)
72+
if (!shouldEmitNonNullCheck(CGM, BaseTy))
6273
return;
6374

64-
if (!(BaseTy->isCheckedPointerType() || BaseTy->isCheckedArrayType()))
75+
++NumDynamicChecksNonNull;
76+
77+
Value *ConditionVal = Builder.CreateIsNotNull(BaseAddr.getPointer(),
78+
"_Dynamic_check.non_null");
79+
EmitDynamicCheckBlocks(ConditionVal);
80+
}
81+
82+
void CodeGenFunction::EmitDynamicNonNullCheck(Value *Val,
83+
const QualType BaseTy) {
84+
if (!shouldEmitNonNullCheck(CGM, BaseTy))
6585
return;
6686

6787
++NumDynamicChecksNonNull;
6888

69-
Value *ConditionVal =
70-
Builder.CreateIsNotNull(BaseAddr.getPointer(), "_Dynamic_check.non_null");
89+
Value *ConditionVal = Builder.CreateIsNotNull(Val,
90+
"_Dynamic_check.non_null");
7191
EmitDynamicCheckBlocks(ConditionVal);
7292
}
7393

lib/CodeGen/CGExprScalar.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2319,6 +2319,14 @@ static BinOpInfo createBinOpInfoFromIncDec(const UnaryOperator *E,
23192319
return BinOp;
23202320
}
23212321

2322+
static void emitDynamicNonNullCheck(CodeGenFunction &CGF,
2323+
Value *Val, QualType Ty) {
2324+
if (!CGF.CGM.getCodeGenOpts().CheckedCNullPtrArith)
2325+
return;
2326+
2327+
CGF.EmitDynamicNonNullCheck(Val, Ty);
2328+
}
2329+
23222330
llvm::Value *ScalarExprEmitter::EmitIncDecConsiderOverflowBehavior(
23232331
const UnaryOperator *E, llvm::Value *InVal, bool IsInc) {
23242332
llvm::Value *Amount =
@@ -2427,6 +2435,9 @@ ScalarExprEmitter::EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV,
24272435

24282436
// Next most common: pointer increment.
24292437
} else if (const PointerType *ptr = type->getAs<PointerType>()) {
2438+
// Insert a dynamic check for arithmetic on null checked pointers.
2439+
emitDynamicNonNullCheck(CGF, value, type);
2440+
24302441
QualType type = ptr->getPointeeType();
24312442

24322443
// VLA types don't have constant size.
@@ -3162,6 +3173,9 @@ static Value *emitPointerArithmetic(CodeGenFunction &CGF,
31623173
std::swap(pointerOperand, indexOperand);
31633174
}
31643175

3176+
// Insert a dynamic check for arithmetic on null checked pointers.
3177+
emitDynamicNonNullCheck(CGF, pointer, pointerOperand->getType());
3178+
31653179
bool isSigned = indexOperand->getType()->isSignedIntegerOrEnumerationType();
31663180

31673181
unsigned width = cast<llvm::IntegerType>(index->getType())->getBitWidth();

lib/CodeGen/CodeGenFunction.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2923,6 +2923,7 @@ class CodeGenFunction : public CodeGenTypeCache {
29232923

29242924
void EmitExplicitDynamicCheck(const Expr *Condition);
29252925
void EmitDynamicNonNullCheck(const Address BaseAddr, const QualType BaseTy);
2926+
void EmitDynamicNonNullCheck(llvm::Value *Val, const QualType BaseTy);
29262927
void EmitDynamicOverflowCheck(const Address BaseAddr, const QualType BaseTy,
29272928
const Address PtrAddr);
29282929
/// \brief Emit a dynamic bounds check.

lib/Driver/ToolChains/Clang.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4721,6 +4721,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
47214721
Args.AddLastArg(CmdArgs, options::OPT_fno_checkedc_extension);
47224722
Args.AddLastArg(CmdArgs, options::OPT_fdump_inferred_bounds);
47234723

4724+
Args.AddLastArg(CmdArgs, options::OPT_fcheckedc_null_ptr_arith,
4725+
options::OPT_fno_checkedc_null_ptr_arith);
4726+
47244727
// -fno-declspec is default, except for PS4.
47254728
if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
47264729
RawTriple.isPS4()))

lib/Frontend/CompilerInvocation.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
13221322

13231323
Opts.DefaultFunctionAttrs = Args.getAllArgValues(OPT_default_function_attr);
13241324

1325+
Opts.CheckedCNullPtrArith = !Args.hasArg(OPT_fno_checkedc_null_ptr_arith);
1326+
13251327
return Success;
13261328
}
13271329

test/CheckedC/dynamic-checks/array-compound-assign-code-gen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
// RUN: %clang_cc1 -fcheckedc-extension -verify -verify-ignore-unexpected=note %s -ast-dump | FileCheck %s --check-prefix=CHECK-AST
3-
// RUN: %clang_cc1 -fcheckedc-extension -verify -verify-ignore-unexpected=note %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
3+
// RUN: %clang_cc1 -fcheckedc-extension -fno-checkedc-null-ptr-arith -verify -verify-ignore-unexpected=note %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
44

55
// In the following generated IR, we do not verify the alignment of any loads/stores
66
// ie, the IR checked by line 37 might read "%1 = load i32*, i32** @gp1, align 4"

test/CheckedC/dynamic-checks/array-increment-code-gen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
// RUN: %clang_cc1 -fcheckedc-extension -verify -verify-ignore-unexpected=note %s -ast-dump | FileCheck %s --check-prefix=CHECK-AST
3-
// RUN: %clang_cc1 -fcheckedc-extension -verify -verify-ignore-unexpected=note %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
3+
// RUN: %clang_cc1 -fcheckedc-extension -fno-checkedc-null-ptr-arith -verify -verify-ignore-unexpected=note %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
44

55
// In the following generated IR, we do not verify the alignment of any loads/stores
66
// ie, the IR checked by line 37 might read "%1 = load i32*, i32** @gp1, align 4"

test/CheckedC/dynamic-checks/array-read-code-gen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
// RUN: %clang_cc1 -fcheckedc-extension -verify -verify-ignore-unexpected=note %s -ast-dump | FileCheck %s --check-prefix=CHECK-AST
3-
// RUN: %clang_cc1 -fcheckedc-extension -verify -verify-ignore-unexpected=note %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
3+
// RUN: %clang_cc1 -fcheckedc-extension -fno-checkedc-null-ptr-arith -verify -verify-ignore-unexpected=note %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
44

55
// In the following generated IR, we do not verify the alignment of any loads/stores
66
// ie, the IR checked by line 37 might read "%1 = load i32*, i32** @gp1, align 4"

test/CheckedC/dynamic-checks/array-write-code-gen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
// RUN: %clang_cc1 -fcheckedc-extension -verify -verify-ignore-unexpected=note %s -ast-dump | FileCheck %s --check-prefix=CHECK-AST
3-
// RUN: %clang_cc1 -fcheckedc-extension -verify -verify-ignore-unexpected=note %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
3+
// RUN: %clang_cc1 -fcheckedc-extension -fno-checkedc-null-ptr-arith -verify -verify-ignore-unexpected=note %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
44

55
// In the following generated IR, we do not verify the alignment of any loads/stores
66
// ie, the IR checked by line 37 might read "%1 = load i32*, i32** @gp1, align 4"
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
2+
3+
#include <stdchecked.h>
4+
#include <stddef.h>
5+
6+
array_ptr<char> p : count(3) = "abc";
7+
array_ptr<char> q : count(3) = "abc";
8+
// NOCHECK-NOT: _Dynamic_check.non_null
9+
10+
void f1() {
11+
// CHECK-LABEL: f1
12+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
13+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
14+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
15+
p++;
16+
}
17+
18+
void f2() {
19+
// CHECK-LABEL: f2
20+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
21+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
22+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
23+
++p;
24+
}
25+
26+
void f3() {
27+
// CHECK-LABEL: f3
28+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
29+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
30+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
31+
p--;
32+
}
33+
34+
void f4() {
35+
// CHECK-LABEL: f4
36+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
37+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
38+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
39+
--p;
40+
}
41+
42+
void f5() {
43+
// CHECK-LABEL: f5
44+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
45+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
46+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
47+
p += 5;
48+
}
49+
50+
void f6() {
51+
// CHECK-LABEL: f6
52+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
53+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
54+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
55+
p -= 10;
56+
}
57+
58+
void f7() {
59+
// CHECK-LABEL: f7
60+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
61+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
62+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
63+
p = 2 + p;
64+
}
65+
66+
void f8() {
67+
// CHECK-LABEL: f8
68+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
69+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
70+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
71+
p = p - 100;
72+
}
73+
74+
void f9() {
75+
// CHECK-LABEL: f9
76+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
77+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
78+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
79+
p[1]++;
80+
}
81+
82+
void f10() {
83+
// CHECK-LABEL: f10
84+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
85+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
86+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
87+
88+
// CHECK: [[REG1:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
89+
// CHECK: [[REG2:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
90+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG2]], null
91+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
92+
p[1] = p[2] + (*p)++;
93+
}
94+
95+
void f11(array_ptr<char> a);
96+
void f12() {
97+
// CHECK-LABEL: f12
98+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
99+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG0]], null
100+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
101+
f11(++p);
102+
}
103+
104+
void f13() {
105+
// CHECK-LABEL: f13
106+
// CHECK: [[REG0:%[a-zA-Z0-9.]*]] = load i8*, i8** @p, align 8
107+
// CHECK: [[REG1:%[a-zA-Z0-9.]*]] = load i8*, i8** @q, align 8
108+
// CHECK-NEXT: [[REG_DYNN:%_Dynamic_check.non_null[a-zA-Z0-9.]*]] = icmp ne i8* [[REG1]], null
109+
// CHECK-NEXT: br i1 [[REG_DYNN]], label %[[LAB_DYSUC:_Dynamic_check.succeeded[a-zA-Z0-9.]*]], label %[[LAB_DYFAIL:_Dynamic_check.failed[a-zA-Z0-9.]*]]
110+
p[q[1]++]++;
111+
}

test/CheckedC/dynamic-checks/struct-compound-assign-code-gen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
// RUN: %clang_cc1 -fcheckedc-extension %s -ast-dump | FileCheck %s --check-prefix=CHECK-AST
3-
// RUN: %clang_cc1 -fcheckedc-extension %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
3+
// RUN: %clang_cc1 -fcheckedc-extension -fno-checkedc-null-ptr-arith %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
44

55
// In the following generated IR, we do not verify the alignment of any loads/stores
66
// ie, the IR checked by line 37 might read "%1 = load i32*, i32** @gp1, align 4"

test/CheckedC/dynamic-checks/struct-increment-code-gen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
// RUN: %clang_cc1 -fcheckedc-extension %s -ast-dump | FileCheck %s --check-prefix=CHECK-AST
3-
// RUN: %clang_cc1 -fcheckedc-extension %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
3+
// RUN: %clang_cc1 -fcheckedc-extension -fno-checkedc-null-ptr-arith %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
44

55
// In the following generated IR, we do not verify the alignment of any loads/stores
66
// ie, the IR checked by line 37 might read "%1 = load i32*, i32** @gp1, align 4"

test/CheckedC/dynamic-checks/struct-read-code-gen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
// RUN: %clang_cc1 -fcheckedc-extension %s -ast-dump | FileCheck %s --check-prefix=CHECK-AST
3-
// RUN: %clang_cc1 -fcheckedc-extension %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
3+
// RUN: %clang_cc1 -fcheckedc-extension -fno-checkedc-null-ptr-arith %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
44

55
// In the following generated IR, we do not verify the alignment of any loads/stores
66
// ie, the IR checked by line 37 might read "%1 = load i32*, i32** @gp1, align 4"

test/CheckedC/dynamic-checks/struct-write-code-gen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
// RUN: %clang_cc1 -fcheckedc-extension %s -ast-dump | FileCheck %s --check-prefix=CHECK-AST
3-
// RUN: %clang_cc1 -fcheckedc-extension %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
3+
// RUN: %clang_cc1 -fcheckedc-extension -fno-checkedc-null-ptr-arith %s -emit-llvm -O0 -o - | FileCheck %s --check-prefix=CHECK-IR
44

55
// In the following generated IR, we do not verify the alignment of any loads/stores
66
// ie, the IR checked by line 37 might read "%1 = load i32*, i32** @gp1, align 4"

tools/checked-c-convert/ArrayBoundsInferenceConsumer.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,10 @@ void HandleArrayVariablesBoundsDetection(ASTContext *C, ProgramInfo &I) {
117117
LocalVarABVisitor LVAB(C, I);
118118
TranslationUnitDecl *TUD = C->getTranslationUnitDecl();
119119
for (const auto &D : TUD->decls()) {
120-
if (dyn_cast<FunctionDecl>(D)) {
121-
FunctionDecl *fb = dyn_cast<FunctionDecl>(D);
122120
#ifdef DEBUG
123-
llvm::dbgs() << "Analyzing function:" << fb->getName() << "\n";
121+
if (auto *FB = dyn_cast<FunctionDecl>(D))
122+
llvm::dbgs() << "Analyzing function:" << FB->getName() << "\n";
124123
#endif
125-
}
126124
LVAB.TraverseDecl(D);
127125
}
128-
}
126+
}

tools/checked-c-convert/ConstraintBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ class FunctionVisitor : public RecursiveASTVisitor<FunctionVisitor> {
456456

457457
i++;
458458
}
459-
} else if (DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D))
459+
} else if (isa<DeclaratorDecl>(D))
460460
handleFunctionPointerCall(E);
461461
else
462462
// Constrain all arguments to wild.

tools/checked-c-convert/ConstraintVariables.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ PointerVariableConstraint::PointerVariableConstraint(const QualType &QT, Constra
5050
if (InteropTypeExpr *ITE = D->getInteropTypeExpr()) {
5151
// External variables can also have itype. So, check if the provided
5252
// declaration is an external variable.
53-
if (dyn_cast<VarDecl>(D) && dyn_cast<VarDecl>(D)->isExternC()) {
53+
if (isa<VarDecl>(D) && cast<VarDecl>(D)->isExternC()) {
5454
QualType InteropType = C.getInteropTypeAndAdjust(ITE, false);
5555
// TODO: handle array_ptr types.
5656
if (InteropType->isCheckedPointerPtrType()) {

tools/checked-c-convert/Constraints.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ bool Constraints::canAssignConst(VarAtom *src) {
166166
// of the provided type.
167167
if (Not *N = dyn_cast<Not>(C))
168168
if (Eq *E = dyn_cast<Eq>(N->getBody()))
169-
if (dyn_cast<T>(E->getRHS()))
169+
if (isa<T>(E->getRHS()))
170170
return false;
171171
}
172172
return true;

tools/checked-c-convert/ProgramInfo.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,7 @@ ProgramInfo::getVariable(clang::Decl *D, clang::ASTContext *C, bool inFunctionCo
808808

809809
// if this a function declaration
810810
// set in context to false.
811-
if (dyn_cast<FunctionDecl>(D))
811+
if (isa<FunctionDecl>(D))
812812
inFunctionContext = false;
813813

814814
return getVariableOnDemand(D, C, inFunctionContext);
@@ -824,16 +824,16 @@ ProgramInfo::getVariableOnDemand(Decl *D, ASTContext *C, bool inFunctionContext)
824824
// variable, or return value then we should see if we're looking this
825825
// up in the context of a function or not. If we are not, then we
826826
// should find a declaration
827-
ParmVarDecl *PD = nullptr;
828827
FunctionDecl *funcDefinition = nullptr;
829828
FunctionDecl *funcDeclaration = nullptr;
830829
// get the function declaration and definition
831-
if (D != nullptr && dyn_cast<FunctionDecl>(D)) {
832-
funcDeclaration = getDeclaration(dyn_cast<FunctionDecl>(D));
833-
funcDefinition = getDefinition(dyn_cast<FunctionDecl>(D));
830+
if (D != nullptr && isa<FunctionDecl>(D)) {
831+
auto *FDecl = cast<FunctionDecl>(D);
832+
funcDeclaration = getDeclaration(FDecl);
833+
funcDefinition = getDefinition(FDecl);
834834
}
835835
int parameterIndex = -1;
836-
if (PD = dyn_cast<ParmVarDecl>(D)) {
836+
if (auto *PD = dyn_cast<ParmVarDecl>(D)) {
837837
// okay, we got a request for a parameter
838838
DeclContext *DC = PD->getParentFunctionOrMethod();
839839
assert(DC != nullptr);

0 commit comments

Comments
 (0)