[Sema] Fix an assert when a block captures a constexpr local
authorErik Pilkington <erik.pilkington@gmail.com>
Tue, 26 Mar 2019 23:21:19 +0000 (23:21 +0000)
committerErik Pilkington <erik.pilkington@gmail.com>
Tue, 26 Mar 2019 23:21:19 +0000 (23:21 +0000)
commit14f6d1527c706d0749bad224fb6a4d2586d608f4
treee8e4e67b2a0d950f23b951cefd8de31d76500661
parente6eef49f05dadd781a708e68c2fc91ff5aff64a1
[Sema] Fix an assert when a block captures a constexpr local

MarkVarDeclODRUsed indirectly calls captureInBlock, which creates a copy
expression. The copy expression is insulated in it's own
ExpressionEvaluationContext, so it saves, mutates, and restores MaybeODRUseExprs
as CleanupVarDeclMarking is iterating through it, leading to a crash. Fix this
by iterating through a local copy of MaybeODRUseExprs.

rdar://47493525

https://reviews.llvm.org/D59670

llvm-svn: 357040
clang/include/clang/Sema/Sema.h
clang/lib/Sema/SemaExpr.cpp
clang/test/SemaCXX/blocks.cpp