forked from OSchip/llvm-project
[libclang] CoroutineBody/Coreturn statements are UnexposedStmts and not Exprs
This change ensures that the libclang CXCursor represents the CoroutineBody and the Coreturn statement using the appropriate CXCursor_UnexposedStmt kind instead of CXCursor_UnexposedExpr. The problem with CXCursor_UnexposedExpr is that the consumer functions assumed that CoroutineBody/Coreturn statements were valid expressions and performed an invalid downcast to Expr causing assertion failures or other crashes. rdar://40204290 llvm-svn: 350282
This commit is contained in:
parent
c28daec5b2
commit
977ffd7b8f
|
@ -0,0 +1,24 @@
|
|||
// RUN: c-index-test -test-load-source all -c %s -fsyntax-only -target x86_64-apple-darwin9 -fcoroutines-ts -std=c++1z -I%S/../SemaCXX/Inputs | FileCheck %s
|
||||
#include "std-coroutine.h"
|
||||
|
||||
using std::experimental::suspend_always;
|
||||
using std::experimental::suspend_never;
|
||||
|
||||
struct promise_void {
|
||||
void get_return_object();
|
||||
suspend_always initial_suspend();
|
||||
suspend_always final_suspend();
|
||||
void return_void();
|
||||
void unhandled_exception();
|
||||
};
|
||||
|
||||
template <>
|
||||
struct std::experimental::coroutine_traits<void> { using promise_type = promise_void; };
|
||||
|
||||
void CoroutineTestRet() {
|
||||
co_return;
|
||||
}
|
||||
// CHECK: [[@LINE-3]]:25: UnexposedStmt=
|
||||
// CHECK-SAME: [[@LINE-4]]:25 - [[@LINE-2]]:2]
|
||||
// CHECK: [[@LINE-4]]:5: UnexposedStmt=
|
||||
// CHECK-SAME: [[@LINE-5]]:5 - [[@LINE-5]]:14]
|
|
@ -241,16 +241,19 @@ CXCursor cxcursor::MakeCXCursor(const Stmt *S, const Decl *Parent,
|
|||
case Stmt::SEHLeaveStmtClass:
|
||||
K = CXCursor_SEHLeaveStmt;
|
||||
break;
|
||||
|
||||
|
||||
case Stmt::CoroutineBodyStmtClass:
|
||||
case Stmt::CoreturnStmtClass:
|
||||
K = CXCursor_UnexposedStmt;
|
||||
break;
|
||||
|
||||
case Stmt::ArrayTypeTraitExprClass:
|
||||
case Stmt::AsTypeExprClass:
|
||||
case Stmt::AtomicExprClass:
|
||||
case Stmt::BinaryConditionalOperatorClass:
|
||||
case Stmt::TypeTraitExprClass:
|
||||
case Stmt::CoroutineBodyStmtClass:
|
||||
case Stmt::CoawaitExprClass:
|
||||
case Stmt::DependentCoawaitExprClass:
|
||||
case Stmt::CoreturnStmtClass:
|
||||
case Stmt::CoyieldExprClass:
|
||||
case Stmt::CXXBindTemporaryExprClass:
|
||||
case Stmt::CXXDefaultArgExprClass:
|
||||
|
|
Loading…
Reference in New Issue