diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index 8fbcc9ae3eec9..79b0a3857d075 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -445,7 +445,9 @@ bool ByteCodeExprGen::VisitArraySubscriptExpr( const ArraySubscriptExpr *E) { const Expr *Base = E->getBase(); const Expr *Index = E->getIdx(); - PrimType IndexT = classifyPrim(Index->getType()); + + if (DiscardResult) + return this->discard(Base) && this->discard(Index); // Take pointer of LHS, add offset from RHS. // What's left on the stack after this is a pointer. @@ -455,13 +457,8 @@ bool ByteCodeExprGen::VisitArraySubscriptExpr( if (!this->visit(Index)) return false; - if (!this->emitArrayElemPtrPop(IndexT, E)) - return false; - - if (DiscardResult) - return this->emitPopPtr(E); - - return true; + PrimType IndexT = classifyPrim(Index->getType()); + return this->emitArrayElemPtrPop(IndexT, E); } template diff --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp index d4ade51b1d71c..b8467b86c4c90 100644 --- a/clang/test/AST/Interp/literals.cpp +++ b/clang/test/AST/Interp/literals.cpp @@ -899,6 +899,8 @@ namespace DiscardExprs { (int){1}; (int[]){1,2,3}; + int arr[] = {1,2,3}; + arr[0]; return 0; }