r373272 - Fix crash on value-dependent delete-expressions.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 30 15:55:27 PDT 2019
Author: rsmith
Date: Mon Sep 30 15:55:27 2019
New Revision: 373272
URL: http://llvm.org/viewvc/llvm-project?rev=373272&view=rev
Log:
Fix crash on value-dependent delete-expressions.
We used to miscompute the 'value-dependent' bit, and would crash if we
tried to evaluate a delete expression that should be value-dependent.
Modified:
cfe/trunk/include/clang/AST/ExprCXX.h
cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp
Modified: cfe/trunk/include/clang/AST/ExprCXX.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=373272&r1=373271&r2=373272&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/ExprCXX.h (original)
+++ cfe/trunk/include/clang/AST/ExprCXX.h Mon Sep 30 15:55:27 2019
@@ -2278,8 +2278,8 @@ public:
CXXDeleteExpr(QualType Ty, bool GlobalDelete, bool ArrayForm,
bool ArrayFormAsWritten, bool UsualArrayDeleteWantsSize,
FunctionDecl *OperatorDelete, Expr *Arg, SourceLocation Loc)
- : Expr(CXXDeleteExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
- Arg->isInstantiationDependent(),
+ : Expr(CXXDeleteExprClass, Ty, VK_RValue, OK_Ordinary, false,
+ Arg->isValueDependent(), Arg->isInstantiationDependent(),
Arg->containsUnexpandedParameterPack()),
OperatorDelete(OperatorDelete), Argument(Arg) {
CXXDeleteExprBits.GlobalDelete = GlobalDelete;
Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp?rev=373272&r1=373271&r2=373272&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp (original)
+++ cfe/trunk/test/SemaCXX/constant-expression-cxx2a.cpp Mon Sep 30 15:55:27 2019
@@ -1056,6 +1056,12 @@ namespace delete_random_things {
static_assert((delete &(int&)(int&&)0, true)); // expected-error {{}} expected-note {{delete of pointer '&0' that does not point to a heap-allocated object}} expected-note {{temporary created here}}
}
+namespace value_dependent_delete {
+ template<typename T> void f(T *p) {
+ int arr[(delete p, 0)];
+ }
+}
+
namespace memory_leaks {
static_assert(*new bool(true)); // expected-error {{}} expected-note {{allocation performed here was not deallocated}}
More information about the cfe-commits
mailing list