diff options
| author | Brian Gesiak <modocache@gmail.com> | 2018-07-11 00:45:48 +0000 |
|---|---|---|
| committer | Brian Gesiak <modocache@gmail.com> | 2018-07-11 00:45:48 +0000 |
| commit | 32ee712435e8a157e4c757223bc11418c1346ff8 (patch) | |
| tree | 8a96cfde5b2a2b5fd480fb72af54438dc72d035a | |
| parent | 869038e36258798d54f4c47b5ee9bf2c33b7f86a (diff) | |
| download | bcm5719-llvm-32ee712435e8a157e4c757223bc11418c1346ff8.tar.gz bcm5719-llvm-32ee712435e8a157e4c757223bc11418c1346ff8.zip | |
Remove qualtype qualifier in coroutine error to prevent assert in debug
Summary:
A forward-declared coroutine_traits should trip an error; we need
a complete type.
Unfortunately, in debug mode only, we trip an assert when attempting
to provide the fully qualified type for the error message.
If you try to compile a program with a forward-declared
coroutine_traits in debug mode, clang will crash.
I've included a test for the behavior and removed the q modifier
on the error message. This prevents the crash in debug mode and
does not change the behavior for the error message on a
forward-declaration of a coroutine_traits type.
Test Plan:
I've included a test for the forward-declaration.
Patch by Tanoy Sinha!
Reviewers: modocache, GorNishanov
Reviewed By: modocache
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D49099
llvm-svn: 336748
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
| -rw-r--r-- | clang/test/SemaCXX/coroutine-traits-undefined-template.cpp | 21 |
2 files changed, 22 insertions, 1 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index e6d2de17910..a52ac69a333 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -9082,7 +9082,7 @@ def err_coroutine_promise_type_incomplete : Error< "this function cannot be a coroutine: %0 is an incomplete type">; def err_coroutine_type_missing_specialization : Error< "this function cannot be a coroutine: missing definition of " - "specialization %q0">; + "specialization %0">; def err_coroutine_promise_incompatible_return_functions : Error< "the coroutine promise type %0 declares both 'return_value' and 'return_void'">; def err_coroutine_promise_requires_return_function : Error< diff --git a/clang/test/SemaCXX/coroutine-traits-undefined-template.cpp b/clang/test/SemaCXX/coroutine-traits-undefined-template.cpp new file mode 100644 index 00000000000..9016db8dde5 --- /dev/null +++ b/clang/test/SemaCXX/coroutine-traits-undefined-template.cpp @@ -0,0 +1,21 @@ +// test/SemaCXX/coroutine-traits-undefined-template.cpp + +// This file contains references to sections of the Coroutines TS, which can be +// found at http://wg21.link/coroutines. + +// RUN: %clang_cc1 -std=c++14 -fcoroutines-ts -verify %s -fcxx-exceptions -fexceptions -Wunused-result + +namespace std { +namespace experimental { + +template<typename ...T> +struct coroutine_traits { + struct promise_type {}; +}; + +template<> struct coroutine_traits<void>; // expected-note {{forward declaration of 'std::experimental::coroutine_traits<void>'}} +}} // namespace std::experimental + +void uses_forward_declaration() { + co_return; // expected-error {{this function cannot be a coroutine: missing definition of specialization 'coroutine_traits<void>'}} +} |

