diff --git a/clang/lib/AST/Interp/Interp.cpp b/clang/lib/AST/Interp/Interp.cpp index 0766ad88e9224..683151f7caf52 100644 --- a/clang/lib/AST/Interp/Interp.cpp +++ b/clang/lib/AST/Interp/Interp.cpp @@ -272,7 +272,7 @@ static bool CheckConstant(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { } bool CheckDummy(InterpState &S, CodePtr OpPC, const Pointer &Ptr) { - return !Ptr.isZero() && !Ptr.isDummy(); + return !Ptr.isDummy(); } bool CheckNull(InterpState &S, CodePtr OpPC, const Pointer &Ptr, diff --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h index e41604e125eba..6c99fa2f9d14b 100644 --- a/clang/lib/AST/Interp/Interp.h +++ b/clang/lib/AST/Interp/Interp.h @@ -1855,6 +1855,23 @@ inline bool ArrayElemPtr(InterpState &S, CodePtr OpPC) { const T &Offset = S.Stk.pop(); const Pointer &Ptr = S.Stk.peek(); + if (!CheckDummy(S, OpPC, Ptr)) + return false; + + if (!OffsetHelper(S, OpPC, Offset, Ptr)) + return false; + + return NarrowPtr(S, OpPC); +} + +template ::T> +inline bool ArrayElemPtrPop(InterpState &S, CodePtr OpPC) { + const T &Offset = S.Stk.pop(); + const Pointer &Ptr = S.Stk.pop(); + + if (!CheckDummy(S, OpPC, Ptr)) + return false; + if (!OffsetHelper(S, OpPC, Offset, Ptr)) return false; @@ -1877,17 +1894,6 @@ inline bool ArrayDecay(InterpState &S, CodePtr OpPC) { return false; } -template ::T> -inline bool ArrayElemPtrPop(InterpState &S, CodePtr OpPC) { - const T &Offset = S.Stk.pop(); - const Pointer &Ptr = S.Stk.pop(); - - if (!OffsetHelper(S, OpPC, Offset, Ptr)) - return false; - - return NarrowPtr(S, OpPC); -} - inline bool Call(InterpState &S, CodePtr OpPC, const Function *Func) { if (Func->hasThisPointer()) { size_t ThisOffset = diff --git a/clang/lib/AST/Interp/Pointer.h b/clang/lib/AST/Interp/Pointer.h index 53b89c51b5a81..b3a3a98a043c7 100644 --- a/clang/lib/AST/Interp/Pointer.h +++ b/clang/lib/AST/Interp/Pointer.h @@ -340,7 +340,11 @@ class Pointer { /// Checks if a structure is a base class. bool isBaseClass() const { return isField() && getInlineDesc()->IsBase; } /// Checks if the pointer pointers to a dummy value. - bool isDummy() const { return getDeclDesc()->isDummy(); } + bool isDummy() const { + if (!Pointee) + return false; + return getDeclDesc()->isDummy(); + } /// Checks if an object or a subfield is mutable. bool isConst() const { diff --git a/clang/test/Sema/fp-eval-pragma-with-float-double_t-1.c b/clang/test/Sema/fp-eval-pragma-with-float-double_t-1.c index ed47101d64430..c72510beddb13 100644 --- a/clang/test/Sema/fp-eval-pragma-with-float-double_t-1.c +++ b/clang/test/Sema/fp-eval-pragma-with-float-double_t-1.c @@ -1,23 +1,40 @@ // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s -// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ -// RUN: -x c++ -DCPP -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s -fexperimental-new-constant-interpreter + +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP -DNOERROR %s -fexperimental-new-constant-interpreter // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -ffp-eval-method=source -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -ffp-eval-method=source -DNOERROR %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ // RUN: -ffp-eval-method=source \ // RUN: -DNOERROR %s - +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ +// RUN: -ffp-eval-method=source \ +// RUN: -DNOERROR %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -ffp-eval-method=double %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -ffp-eval-method=double %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ // RUN: -ffp-eval-method=double %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ +// RUN: -ffp-eval-method=double %s -fexperimental-new-constant-interpreter // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -ffp-eval-method=extended %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -ffp-eval-method=extended %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ // RUN: -ffp-eval-method=extended %s - +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ +// RUN: -ffp-eval-method=extended %s -fexperimental-new-constant-interpreter #ifdef NOERROR // expected-no-diagnostics diff --git a/clang/test/Sema/fp-eval-pragma-with-float-double_t-2.c b/clang/test/Sema/fp-eval-pragma-with-float-double_t-2.c index 61bf7c970807c..f26b43f7cd378 100644 --- a/clang/test/Sema/fp-eval-pragma-with-float-double_t-2.c +++ b/clang/test/Sema/fp-eval-pragma-with-float-double_t-2.c @@ -1,21 +1,41 @@ // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -x c++ -DCPP -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -x c++ -DCPP -DNOERROR %s -fexperimental-new-constant-interpreter // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -ffp-eval-method=double -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -ffp-eval-method=double -DNOERROR %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ // RUN: -ffp-eval-method=double -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ +// RUN: -ffp-eval-method=double -DNOERROR %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -ffp-eval-method=source %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -ffp-eval-method=source %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ // RUN: -ffp-eval-method=source %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ +// RUN: -ffp-eval-method=source %s -fexperimental-new-constant-interpreter // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -ffp-eval-method=extended %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -ffp-eval-method=extended %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ // RUN: -ffp-eval-method=extended %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ +// RUN: -ffp-eval-method=extended %s -fexperimental-new-constant-interpreter #ifdef NOERROR // expected-no-diagnostics diff --git a/clang/test/Sema/fp-eval-pragma-with-float-double_t-3.c b/clang/test/Sema/fp-eval-pragma-with-float-double_t-3.c index 8be5c5535af39..d58a36dc108ae 100644 --- a/clang/test/Sema/fp-eval-pragma-with-float-double_t-3.c +++ b/clang/test/Sema/fp-eval-pragma-with-float-double_t-3.c @@ -1,22 +1,40 @@ // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -DNOERROR %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -x c++ -DCPP -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -x c++ -DCPP -DNOERROR %s -fexperimental-new-constant-interpreter // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -ffp-eval-method=extended -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -ffp-eval-method=extended -DNOERROR %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ // RUN: -ffp-eval-method=extended -DNOERROR %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ +// RUN: -ffp-eval-method=extended -DNOERROR %s -fexperimental-new-constant-interpreter // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -ffp-eval-method=source %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -ffp-eval-method=source %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ // RUN: -ffp-eval-method=source %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ +// RUN: -ffp-eval-method=source %s -fexperimental-new-constant-interpreter // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ // RUN: -ffp-eval-method=double %s +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only \ +// RUN: -ffp-eval-method=double %s -fexperimental-new-constant-interpreter + // RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ // RUN: -ffp-eval-method=double %s - +// RUN: %clang_cc1 -verify -triple x86_64-linux-gnu -fsyntax-only -x c++ -DCPP \ +// RUN: -ffp-eval-method=double %s -fexperimental-new-constant-interpreter #ifdef NOERROR // expected-no-diagnostics