Skip to content

Commit bc6ad2b

Browse files
committed
fix(spanner): avoid evaluation-order issue in function arguments
The behavior of ``` extern void f(std::unique_ptr<T>, T); std::unique_ptr<T> p = ...; f(std::move(p), *p); ``` is undefined, so introduce a sequence point between dereferencing the `unique_ptr` and moving it.
1 parent 5e15ecb commit bc6ad2b

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

google/cloud/spanner/internal/connection_impl.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -469,9 +469,10 @@ spanner::RowStream ConnectionImpl::ReadImpl(
469469
tracing_options](std::string const& resume_token) mutable {
470470
if (!resume_token.empty()) request->set_resume_token(resume_token);
471471
auto context = absl::make_unique<grpc::ClientContext>();
472+
auto grpc_reader = stub->StreamingRead(*context, *request);
472473
std::unique_ptr<PartialResultSetReader> reader =
473474
absl::make_unique<DefaultPartialResultSetReader>(
474-
std::move(context), stub->StreamingRead(*context, *request));
475+
std::move(context), std::move(grpc_reader));
475476
if (tracing_enabled) {
476477
reader = absl::make_unique<LoggingResultSetReader>(std::move(reader),
477478
tracing_options);
@@ -688,9 +689,10 @@ ResultType ConnectionImpl::CommonQueryImpl(
688689
tracing_options](std::string const& resume_token) mutable {
689690
if (!resume_token.empty()) request.set_resume_token(resume_token);
690691
auto context = absl::make_unique<grpc::ClientContext>();
692+
auto grpc_reader = stub->ExecuteStreamingSql(*context, request);
691693
std::unique_ptr<PartialResultSetReader> reader =
692694
absl::make_unique<DefaultPartialResultSetReader>(
693-
std::move(context), stub->ExecuteStreamingSql(*context, request));
695+
std::move(context), std::move(grpc_reader));
694696
if (tracing_enabled) {
695697
reader = absl::make_unique<LoggingResultSetReader>(std::move(reader),
696698
tracing_options);

0 commit comments

Comments
 (0)