From fd42079255d04742e60954e98205a9212e2685ff Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 24 May 2019 23:26:07 +0000 Subject: [PATCH] Fix crash deserializing a CUDAKernelCallExpr with a +Asserts binary. The assertion in setConfig read from the (uninitialized) CONFIG expression. llvm-svn: 361680 --- clang/include/clang/AST/ExprCXX.h | 16 ++-------------- clang/lib/Serialization/ASTReaderStmt.cpp | 2 +- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index 4a6aa9014c9ec..551a677570ff9 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -216,6 +216,8 @@ class CXXMemberCallExpr final : public CallExpr { /// Represents a call to a CUDA kernel function. class CUDAKernelCallExpr final : public CallExpr { + friend class ASTStmtReader; + enum { CONFIG, END_PREARG }; // CUDAKernelCallExpr has some trailing objects belonging @@ -241,20 +243,6 @@ class CUDAKernelCallExpr final : public CallExpr { } CallExpr *getConfig() { return cast_or_null(getPreArg(CONFIG)); } - /// Sets the kernel configuration expression. - /// - /// Note that this method cannot be called if config has already been set to a - /// non-null value. - void setConfig(CallExpr *E) { - assert(!getConfig() && - "Cannot call setConfig if config is not null"); - setPreArg(CONFIG, E); - setInstantiationDependent(isInstantiationDependent() || - E->isInstantiationDependent()); - setContainsUnexpandedParameterPack(containsUnexpandedParameterPack() || - E->containsUnexpandedParameterPack()); - } - static bool classof(const Stmt *T) { return T->getStmtClass() == CUDAKernelCallExprClass; } diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index e0647fc6b82bd..4d879b46e1a4a 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -1904,7 +1904,7 @@ void ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) { void ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) { VisitCallExpr(E); - E->setConfig(cast(Record.readSubExpr())); + E->setPreArg(CUDAKernelCallExpr::CONFIG, Record.readSubExpr()); } //===----------------------------------------------------------------------===//