| /* |
| * Copyright 2013 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrProxyMove_DEFINED |
| #define GrProxyMove_DEFINED |
| |
| // In a few places below we rely on braced initialization order being defined by the C++ spec (left |
| // to right). We use operator-> on a sk_sp and then in a later argument std::move() the sk_sp. GCC |
| // 4.9.0 and earlier has a bug where the left to right order evaluation isn't implemented correctly. |
| // |
| // Clang has the same bug when targeting Windows (http://crbug.com/687259). |
| // TODO(hans): Remove work-around once Clang is fixed. |
| #if defined(__GNUC__) && !defined(__clang__) |
| # define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) |
| # if (GCC_VERSION > 40900) |
| # define GCC_EVAL_ORDER_BUG 0 |
| # else |
| # define GCC_EVAL_ORDER_BUG 1 |
| # endif |
| # undef GCC_VERSION |
| #elif defined(_MSC_VER) && defined(__clang__) |
| # define GCC_EVAL_ORDER_BUG 1 |
| #else |
| # define GCC_EVAL_ORDER_BUG 0 |
| #endif |
| |
| #if GCC_EVAL_ORDER_BUG |
| # define GR_PROXY_MOVE(X) (X) |
| #else |
| # define GR_PROXY_MOVE(X) (std::move(X)) |
| #endif |
| |
| #undef GCC_EVAL_ORDER_BUG |
| |
| #endif |