Skip to content

Commit 82950a6

Browse files
committed
[clang][Interp] Protect ArrayElemPtr ops from dummy pointers
Change the semantics of Pointer::isDummy() to check for a null Pointee and returnd false in that case. Then call CheckDummy() in ArrayElemPtr{,Pop} to protect those ops from operating on dummy pointers and enable a few tests in test/Sema/ that now work with the new constant interpreter.
1 parent de8ba2f commit 82950a6

File tree

6 files changed

+83
-18
lines changed

6 files changed

+83
-18
lines changed

clang/lib/AST/Interp/Interp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ static bool CheckConstant(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {
272272
}
273273

274274
bool CheckDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {
275-
return !Ptr.isZero() && !Ptr.isDummy();
275+
return !Ptr.isDummy();
276276
}
277277

278278
bool CheckNull(InterpState &S, CodePtr OpPC, const Pointer &Ptr,

clang/lib/AST/Interp/Interp.h

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1855,6 +1855,23 @@ inline bool ArrayElemPtr(InterpState &S, CodePtr OpPC) {
18551855
const T &Offset = S.Stk.pop<T>();
18561856
const Pointer &Ptr = S.Stk.peek<Pointer>();
18571857

1858+
if (!CheckDummy(S, OpPC, Ptr))
1859+
return false;
1860+
1861+
if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
1862+
return false;
1863+
1864+
return NarrowPtr(S, OpPC);
1865+
}
1866+
1867+
template <PrimType Name, class T = typename PrimConv<Name>::T>
1868+
inline bool ArrayElemPtrPop(InterpState &S, CodePtr OpPC) {
1869+
const T &Offset = S.Stk.pop<T>();
1870+
const Pointer &Ptr = S.Stk.pop<Pointer>();
1871+
1872+
if (!CheckDummy(S, OpPC, Ptr))
1873+
return false;
1874+
18581875
if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
18591876
return false;
18601877

@@ -1877,17 +1894,6 @@ inline bool ArrayDecay(InterpState &S, CodePtr OpPC) {
18771894
return false;
18781895
}
18791896

1880-
template <PrimType Name, class T = typename PrimConv<Name>::T>
1881-
inline bool ArrayElemPtrPop(InterpState &S, CodePtr OpPC) {
1882-
const T &Offset = S.Stk.pop<T>();
1883-
const Pointer &Ptr = S.Stk.pop<Pointer>();
1884-
1885-
if (!OffsetHelper<T, ArithOp::Add>(S, OpPC, Offset, Ptr))
1886-
return false;
1887-
1888-
return NarrowPtr(S, OpPC);
1889-
}
1890-
18911897
inline bool Call(InterpState &S, CodePtr OpPC, const Function *Func) {
18921898
if (Func->hasThisPointer()) {
18931899
size_t ThisOffset =

clang/lib/AST/Interp/Pointer.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,11 @@ class Pointer {
340340
/// Checks if a structure is a base class.
341341
bool isBaseClass() const { return isField() && getInlineDesc()->IsBase; }
342342
/// Checks if the pointer pointers to a dummy value.
343-
bool isDummy() const { return getDeclDesc()->isDummy(); }
343+
bool isDummy() const {
344+
if (!Pointee)
345+
return false;
346+
return getDeclDesc()->isDummy();
347+
}
344348

345349
/// Checks if an object or a subfield is mutable.
346350
bool isConst() const {

clang/test/Sema/fp-eval-pragma-with-float-double_t-1.c

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,40 @@
11
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s
2-
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
3-
// RUN: -x c++ -DCPP -DNOERROR %s
2+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s -fexperimental-new-constant-interpreter
3+
4+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP -DNOERROR %s
5+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP -DNOERROR %s -fexperimental-new-constant-interpreter
46

57
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
68
// RUN: -ffp-eval-method=source -DNOERROR %s
9+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
10+
// RUN: -ffp-eval-method=source -DNOERROR %s -fexperimental-new-constant-interpreter
11+
712
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
813
// RUN: -ffp-eval-method=source \
914
// RUN: -DNOERROR %s
10-
15+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
16+
// RUN: -ffp-eval-method=source \
17+
// RUN: -DNOERROR %s -fexperimental-new-constant-interpreter
18+
1119
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
1220
// RUN: -ffp-eval-method=double %s
21+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
22+
// RUN: -ffp-eval-method=double %s -fexperimental-new-constant-interpreter
23+
1324
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
1425
// RUN: -ffp-eval-method=double %s
26+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
27+
// RUN: -ffp-eval-method=double %s -fexperimental-new-constant-interpreter
1528

1629
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
1730
// RUN: -ffp-eval-method=extended %s
31+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
32+
// RUN: -ffp-eval-method=extended %s -fexperimental-new-constant-interpreter
33+
1834
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
1935
// RUN: -ffp-eval-method=extended %s
20-
36+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
37+
// RUN: -ffp-eval-method=extended %s -fexperimental-new-constant-interpreter
2138

2239
#ifdef NOERROR
2340
// expected-no-diagnostics

clang/test/Sema/fp-eval-pragma-with-float-double_t-2.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,41 @@
11
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s
2+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s -fexperimental-new-constant-interpreter
3+
24
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
35
// RUN: -x c++ -DCPP -DNOERROR %s
6+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
7+
// RUN: -x c++ -DCPP -DNOERROR %s -fexperimental-new-constant-interpreter
48

59
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
610
// RUN: -ffp-eval-method=double -DNOERROR %s
11+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
12+
// RUN: -ffp-eval-method=double -DNOERROR %s -fexperimental-new-constant-interpreter
13+
714
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
815
// RUN: -ffp-eval-method=double -DNOERROR %s
16+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
17+
// RUN: -ffp-eval-method=double -DNOERROR %s -fexperimental-new-constant-interpreter
18+
919

1020
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
1121
// RUN: -ffp-eval-method=source %s
22+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
23+
// RUN: -ffp-eval-method=source %s -fexperimental-new-constant-interpreter
24+
1225
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
1326
// RUN: -ffp-eval-method=source %s
27+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
28+
// RUN: -ffp-eval-method=source %s -fexperimental-new-constant-interpreter
1429

1530
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
1631
// RUN: -ffp-eval-method=extended %s
32+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
33+
// RUN: -ffp-eval-method=extended %s -fexperimental-new-constant-interpreter
34+
1735
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
1836
// RUN: -ffp-eval-method=extended %s
37+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
38+
// RUN: -ffp-eval-method=extended %s -fexperimental-new-constant-interpreter
1939

2040
#ifdef NOERROR
2141
// expected-no-diagnostics

clang/test/Sema/fp-eval-pragma-with-float-double_t-3.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,40 @@
11
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s
2+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s -fexperimental-new-constant-interpreter
3+
24
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
35
// RUN: -x c++ -DCPP -DNOERROR %s
6+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
7+
// RUN: -x c++ -DCPP -DNOERROR %s -fexperimental-new-constant-interpreter
48

59
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
610
// RUN: -ffp-eval-method=extended -DNOERROR %s
11+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
12+
// RUN: -ffp-eval-method=extended -DNOERROR %s -fexperimental-new-constant-interpreter
13+
714
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
815
// RUN: -ffp-eval-method=extended -DNOERROR %s
16+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
17+
// RUN: -ffp-eval-method=extended -DNOERROR %s -fexperimental-new-constant-interpreter
918

1019
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
1120
// RUN: -ffp-eval-method=source %s
21+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
22+
// RUN: -ffp-eval-method=source %s -fexperimental-new-constant-interpreter
23+
1224
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
1325
// RUN: -ffp-eval-method=source %s
26+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
27+
// RUN: -ffp-eval-method=source %s -fexperimental-new-constant-interpreter
1428

1529
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
1630
// RUN: -ffp-eval-method=double %s
31+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \
32+
// RUN: -ffp-eval-method=double %s -fexperimental-new-constant-interpreter
33+
1734
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
1835
// RUN: -ffp-eval-method=double %s
19-
36+
// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \
37+
// RUN: -ffp-eval-method=double %s -fexperimental-new-constant-interpreter
2038

2139
#ifdef NOERROR
2240
// expected-no-diagnostics

0 commit comments

Comments
 (0)