diff --git a/sdk/core/azure-core-amqp/src/impl/uamqp/amqp/claim_based_security.cpp b/sdk/core/azure-core-amqp/src/impl/uamqp/amqp/claim_based_security.cpp index d78b672d3..dfa5d747f 100644 --- a/sdk/core/azure-core-amqp/src/impl/uamqp/amqp/claim_based_security.cpp +++ b/sdk/core/azure-core-amqp/src/impl/uamqp/amqp/claim_based_security.cpp @@ -9,6 +9,8 @@ #include #include +#include + using namespace Azure::Core::Diagnostics::_internal; using namespace Azure::Core::Diagnostics; using namespace Azure::Core::Amqp::_internal; @@ -67,9 +69,19 @@ namespace Azure { namespace Core { namespace Amqp { namespace _detail { message.SetBody(static_cast(token)); message.ApplicationProperties["name"] = static_cast(audience); - message.ApplicationProperties["expiration"] - = std::chrono::duration_cast(tokenExpirationTime.time_since_epoch()) - .count(); + + // It appears that on Android, if you get a "long long" (from std::chrono::seconds::count()) and + // try to pass it to the set of overloads of AmqpValue() which do exist for all the range of + // fixed bit integers, including int64_t and uint64_t, it is still ambiguous for the compiler + // which overload to choose, as if "std::u?int*_t" were not typedefs, but some custom types. + static_assert( + std::is_signed::value + && std::is_integral::value + && sizeof(std::chrono::seconds::rep) <= sizeof(std::int64_t), + "std::chrono::seconds::rep is expected to fit into std::int64_t"); + message.ApplicationProperties["expiration"] = static_cast( + std::chrono::duration_cast(tokenExpirationTime.time_since_epoch()) + .count()); auto result = m_management->ExecuteOperation( "put-token",