From 37b8a374d99cc93b77e8ccf5c77f101f8a3b75e0 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Wed, 31 May 2017 19:36:59 +0000 Subject: [PATCH] [coroutines] Fix assertion during -Wuninitialized analysis Summary: @rsmith Is there a better place to put this test? Reviewers: GorNishanov, rsmith Reviewed By: GorNishanov Subscribers: cfe-commits, rsmith Differential Revision: https://reviews.llvm.org/D33660 llvm-svn: 304331 --- clang/lib/Sema/SemaCoroutine.cpp | 1 + clang/test/SemaCXX/coreturn.cpp | 2 +- .../coroutine-uninitialized-warning-crash.cpp | 44 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaCXX/coroutine-uninitialized-warning-crash.cpp diff --git a/clang/lib/Sema/SemaCoroutine.cpp b/clang/lib/Sema/SemaCoroutine.cpp index ae6c35f22065f..f5594bd64d9a7 100644 --- a/clang/lib/Sema/SemaCoroutine.cpp +++ b/clang/lib/Sema/SemaCoroutine.cpp @@ -437,6 +437,7 @@ VarDecl *Sema::buildCoroutinePromise(SourceLocation Loc) { if (VD->isInvalidDecl()) return nullptr; ActOnUninitializedDecl(VD); + FD->addDecl(VD); assert(!VD->isInvalidDecl()); return VD; } diff --git a/clang/test/SemaCXX/coreturn.cpp b/clang/test/SemaCXX/coreturn.cpp index 0ec94d1b59971..7265d7c19c2e0 100644 --- a/clang/test/SemaCXX/coreturn.cpp +++ b/clang/test/SemaCXX/coreturn.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++14 -fcoroutines-ts -fsyntax-only -Wignored-qualifiers -Wno-error=return-type -verify -fblocks -Wno-unreachable-code -Wno-unused-value +// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++14 -fcoroutines-ts -fsyntax-only -Wignored-qualifiers -Wno-error=return-type -verify -fblocks -Wall -Wextra -Wno-error=unreachable-code #include "Inputs/std-coroutine.h" using std::experimental::suspend_always; diff --git a/clang/test/SemaCXX/coroutine-uninitialized-warning-crash.cpp b/clang/test/SemaCXX/coroutine-uninitialized-warning-crash.cpp new file mode 100644 index 0000000000000..5bdb232d5307c --- /dev/null +++ b/clang/test/SemaCXX/coroutine-uninitialized-warning-crash.cpp @@ -0,0 +1,44 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++14 -fcoroutines-ts -fsyntax-only -Wall -Wextra -Wuninitialized -fblocks +#include "Inputs/std-coroutine.h" + +using namespace std::experimental; + + +struct A { + bool await_ready() { return true; } + int await_resume() { return 42; } + template + void await_suspend(F) {} +}; + + +struct coro_t { + struct promise_type { + coro_t get_return_object() { return {}; } + suspend_never initial_suspend() { return {}; } + suspend_never final_suspend() { return {}; } + A yield_value(int) { return {}; } + void return_void() {} + static void unhandled_exception() {} + }; +}; + +coro_t f(int n) { + if (n == 0) + co_return; + co_yield 42; + int x = co_await A{}; +} + +template +coro_t g(int n) { + if (n == 0) + co_return; + co_yield 42; + int x = co_await Await{}; +} + +int main() { + f(0); + g(0); +}