Commit 28dc85db authored by Stephan Hartmann's avatar Stephan Hartmann Committed by Commit Bot

GCC: fix template specialization in AsyncCallWithBoundArgsBuilder

GCC complains that explicit specialization in non-namespace scope
is happening for AsyncCallWithBoundArgsBuilder. Move
AsyncCallWithBoundArgsBuilder implementations into different
nested classes and select implementation using std::conditional.

Bug: 819294
Change-Id: Ie46c22896c9166d4b0c3114f2c29f65b01ec3568
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2401463Reviewed-by: default avatardanakj <danakj@chromium.org>
Commit-Queue: José Dapena Paz <jose.dapena@lge.com>
Cr-Commit-Position: refs/heads/master@{#805742}
parent b30005b6
......@@ -509,10 +509,10 @@ class SequenceBound {
// Note: this doesn't handle a void return type, which has an explicit
// specialization below.
template <typename ReturnType>
class AsyncCallWithBoundArgsBuilder
class AsyncCallWithBoundArgsBuilderDefault
: public AsyncCallWithBoundArgsBuilderBase<ReturnType> {
public:
~AsyncCallWithBoundArgsBuilder() {
~AsyncCallWithBoundArgsBuilderDefault() {
// Must use Then() since the method's return type is not void.
// Should be optimized out if the code is bug-free.
CHECK(!this->sequence_bound_);
......@@ -535,13 +535,13 @@ class SequenceBound {
private:
friend SequenceBound;
AsyncCallWithBoundArgsBuilder(AsyncCallWithBoundArgsBuilder&&) = default;
AsyncCallWithBoundArgsBuilder& operator=(AsyncCallWithBoundArgsBuilder&&) =
default;
AsyncCallWithBoundArgsBuilderDefault(
AsyncCallWithBoundArgsBuilderDefault&&) = default;
AsyncCallWithBoundArgsBuilderDefault& operator=(
AsyncCallWithBoundArgsBuilderDefault&&) = default;
};
template <>
class AsyncCallWithBoundArgsBuilder<void>
class AsyncCallWithBoundArgsBuilderVoid
: public AsyncCallWithBoundArgsBuilderBase<void> {
public:
// Note: despite being here, this is actually still protected, since it is
......@@ -549,7 +549,7 @@ class SequenceBound {
using AsyncCallWithBoundArgsBuilderBase<
void>::AsyncCallWithBoundArgsBuilderBase;
~AsyncCallWithBoundArgsBuilder() {
~AsyncCallWithBoundArgsBuilderVoid() {
if (this->sequence_bound_) {
this->sequence_bound_->impl_task_runner_->PostTask(
*this->location_, std::move(this->callback_));
......@@ -566,11 +566,18 @@ class SequenceBound {
private:
friend SequenceBound;
AsyncCallWithBoundArgsBuilder(AsyncCallWithBoundArgsBuilder&&) = default;
AsyncCallWithBoundArgsBuilder& operator=(AsyncCallWithBoundArgsBuilder&&) =
AsyncCallWithBoundArgsBuilderVoid(AsyncCallWithBoundArgsBuilderVoid&&) =
default;
AsyncCallWithBoundArgsBuilderVoid& operator=(
AsyncCallWithBoundArgsBuilderVoid&&) = default;
};
template <typename ReturnType>
using AsyncCallWithBoundArgsBuilder = typename std::conditional<
std::is_void<ReturnType>::value,
AsyncCallWithBoundArgsBuilderVoid,
AsyncCallWithBoundArgsBuilderDefault<ReturnType>>::type;
void PostTaskAndThenHelper(const Location& location,
OnceCallback<void()> callback,
OnceClosure then_callback) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment