mapbox / mapbox-gl-native-ios

Interactive, thoroughly customizable maps for iOS powered by vector tiles and OpenGL
https://www.mapbox.com/mobile/
Other
210 stars 121 forks source link

Crash with case expression #316

Open mfazekas opened 4 years ago

mfazekas commented 4 years ago

Steps to reproduce

The following code crashes, at setting lineOpacity

let expression = NSExpression(mglJSONObject:[
            "case",
            ["all", true, false],
            0.5,
            ["all", true, false],
            0.4,
            1.1,
        ]);
        print("expression:",expression, "json", expression.mgl_jsonExpressionObject)
        layer.lineOpacity = expression

Seet this gist for full view controller.

Expected behavior

No crash.

Actual behavior

Crash.

The logged expression:

expression: MGL_IF(TRUEPREDICATE AND FALSEPREDICATE, 0.5, TRUEPREDICATE AND FALSEPREDICATE, 0.4, 1.1) json (
    case,
    "TRUEPREDICATE AND FALSEPREDICATE",
    "0.5",
    "TRUEPREDICATE AND FALSEPREDICATE",
    "0.4",
    "1.1"
)

stack

#0  0x000000010f95a961 in std::__1::__hash_table<std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value>, std::__1::__unordered_map_hasher<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value>, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::__unordered_map_equal<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value>, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, true>, std::__1::allocator<std::__1::__hash_value_type<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value> > >::size() const [inlined] at /Applications/Xcode-11.2.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__hash_table:965
#1  0x000000010f95a961 in std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > >::size() const [inlined] at /Applications/Xcode-11.2.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/unordered_map:1000
#2  0x000000010f95a961 in mbgl::style::expression::FromMBGLValue::operator()(std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > const&) at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/expression/value.cpp:104
#3  0x000000010f958bc7 in mapbox::util::detail::dispatcher<mbgl::style::expression::FromMBGLValue, mapbox::feature::value, mbgl::style::expression::Value, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply_const(mapbox::feature::value const&, mbgl::style::expression::FromMBGLValue&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:343
#4  0x000000010f958bb7 in mapbox::util::detail::dispatcher<mbgl::style::expression::FromMBGLValue, mapbox::feature::value, mbgl::style::expression::Value, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply_const(mapbox::feature::value const&, mbgl::style::expression::FromMBGLValue&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:321
#5  0x000000010f958ba2 in mapbox::util::detail::dispatcher<mbgl::style::expression::FromMBGLValue, mapbox::feature::value, mbgl::style::expression::Value, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply_const(mapbox::feature::value const&, mbgl::style::expression::FromMBGLValue&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:321
#6  0x000000010f958ba2 in mapbox::util::detail::dispatcher<mbgl::style::expression::FromMBGLValue, mapbox::feature::value, mbgl::style::expression::Value, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply_const(mapbox::feature::value const&, mbgl::style::expression::FromMBGLValue&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:321
#7  0x000000010f958ba2 in mapbox::util::detail::dispatcher<mbgl::style::expression::FromMBGLValue, mapbox::feature::value, mbgl::style::expression::Value, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply_const(mapbox::feature::value const&, mbgl::style::expression::FromMBGLValue&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:321
#8  0x000000010f958ba2 in mapbox::util::detail::dispatcher<mbgl::style::expression::FromMBGLValue, mapbox::feature::value, mbgl::style::expression::Value, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply_const(mapbox::feature::value const&, mbgl::style::expression::FromMBGLValue&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:321
#9  0x000000010f958ba2 in mapbox::util::detail::dispatcher<mbgl::style::expression::FromMBGLValue, mapbox::feature::value, mbgl::style::expression::Value, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply_const(mapbox::feature::value const&, mbgl::style::expression::FromMBGLValue&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:321
#10 0x000000010f958ba2 in mapbox::util::detail::dispatcher<mbgl::style::expression::FromMBGLValue, mapbox::feature::value, mbgl::style::expression::Value, mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply_const(mapbox::feature::value const&, mbgl::style::expression::FromMBGLValue&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:321
#11 0x000000010f958b89 in decltype(detail::dispatcher<mbgl::style::expression::FromMBGLValue, mapbox::feature::value, mbgl::style::expression::Value, mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply_const(fp, std::forward<mbgl::style::expression::FromMBGLValue>(fp0))) mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::visit<mbgl::style::expression::FromMBGLValue, mapbox::feature::value, mbgl::style::expression::Value>(mapbox::feature::value const&, mbgl::style::expression::FromMBGLValue&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:879
#12 0x000000010f958b89 in mbgl::style::expression::ValueConverter<mapbox::feature::value, void>::toExpressionValue(mapbox::feature::value const&) at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/expression/value.cpp:124
#13 0x000000010f94233f in mbgl::style::expression::Value mbgl::style::expression::toExpressionValue<mapbox::feature::value>(mapbox::feature::value const&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/include/mbgl/style/expression/value.hpp:134
#14 0x000000010f94233a in auto mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0::operator()<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > >(std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > const&) const [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/expression/literal.cpp:62
#15 0x000000010f94233a in mapbox::util::detail::dispatcher<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>, mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >, std::experimental::optional<mbgl::style::expression::Value>, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply(mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >&, mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:348
#16 0x000000010f94233a in mapbox::util::detail::dispatcher<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>, mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >, std::experimental::optional<mbgl::style::expression::Value>, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply(mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >&, mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:333
#17 0x000000010f94233a in mapbox::util::detail::dispatcher<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>, mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >, std::experimental::optional<mbgl::style::expression::Value>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply(mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >&, mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:333
#18 0x000000010f94233a in mapbox::util::detail::dispatcher<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>, mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >, std::experimental::optional<mbgl::style::expression::Value>, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply(mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >&, mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:333
#19 0x000000010f94233a in mapbox::util::detail::dispatcher<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>, mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >, std::experimental::optional<mbgl::style::expression::Value>, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply(mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >&, mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:333
#20 0x000000010f9422cc in mapbox::util::detail::dispatcher<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>, mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >, std::experimental::optional<mbgl::style::expression::Value>, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply(mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >&, mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:333
#21 0x000000010f94228a in mapbox::util::detail::dispatcher<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>, mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >, std::experimental::optional<mbgl::style::expression::Value>, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply(mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >&, mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:333
#22 0x000000010f94228a in mapbox::util::detail::dispatcher<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>, mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >, std::experimental::optional<mbgl::style::expression::Value>, mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply(mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >&, mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:333
#23 0x000000010f94228a in decltype(detail::dispatcher<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>, mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >, std::experimental::optional<mbgl::style::expression::Value>, mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::apply(fp, std::forward<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0> >(fp0))) mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >::visit<mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>, mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >, std::experimental::optional<mbgl::style::expression::Value> >(mapbox::util::variant<mapbox::feature::null_value_t, bool, unsigned long long, long long, double, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::util::recursive_wrapper<std::__1::vector<mapbox::feature::value, std::__1::allocator<mapbox::feature::value> > >, mapbox::util::recursive_wrapper<std::__1::unordered_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, mapbox::feature::value, std::__1::hash<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::equal_to<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, mapbox::feature::value> > > > >&, mapbox::util::visitor<mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_2, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_3, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_4, mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&)::$_0>&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:886
#24 0x000000010f94228a in _ZN6mapbox4util7variantIJNS_7feature12null_value_tEbyxdNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS0_17recursive_wrapperINS4_6vectorINS2_5valueENS8_ISD_EEEEEENSB_INS4_13unordered_mapISA_SD_NS4_4hashISA_EENS4_8equal_toISA_EENS8_INS4_4pairIKSA_SD_EEEEEEEEEE5matchIJZN4mbgl5style10expression10parseValueERKNSV_10conversion11ConvertibleERNSW_14ParsingContextEE3$_2ZNSW_10parseValueES10_S12_E3$_3ZNSW_10parseValueES10_S12_E3$_4ZNSW_10parseValueES10_S12_E3$_0EEEDTclsr7variantE5visitdefpTclgssr6mapbox4utilE12make_visitorspclsr3stdE7forwardIT_Efp_EEEEDpOS17_ [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/vendor/mapbox-base/deps/variant/include/mapbox/variant.hpp:918
#25 0x000000010f94228a in mbgl::style::expression::parseValue(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&) at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/expression/literal.cpp:57
#26 0x000000010f942a5e in mbgl::style::expression::Literal::parse(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&) at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/expression/literal.cpp:101
#27 0x000000010f9511ea in mbgl::style::expression::ParsingContext::parse(mbgl::style::conversion::Convertible const&, std::experimental::optional<mbgl::style::expression::TypeAnnotationOption> const&) at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/expression/parsing_context.cpp:178
#28 0x000000010f950d3a in mbgl::style::expression::ParsingContext::parse(mbgl::style::conversion::Convertible const&, unsigned long, std::experimental::optional<mapbox::util::variant<mbgl::style::expression::type::NullType, mbgl::style::expression::type::NumberType, mbgl::style::expression::type::BooleanType, mbgl::style::expression::type::StringType, mbgl::style::expression::type::ColorType, mbgl::style::expression::type::ObjectType, mbgl::style::expression::type::ValueType, mapbox::util::recursive_wrapper<mbgl::style::expression::type::Array>, mbgl::style::expression::type::CollatorType, mbgl::style::expression::type::FormattedType, mbgl::style::expression::type::ErrorType, mbgl::style::expression::type::ImageType> >, std::experimental::optional<mbgl::style::expression::TypeAnnotationOption> const&) at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/expression/parsing_context.cpp:95
#29 0x000000010f8f37fc in mbgl::style::expression::Case::parse(mbgl::style::conversion::Convertible const&, mbgl::style::expression::ParsingContext&) at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/expression/case.cpp:75
#30 0x000000010f9516e7 in mbgl::style::expression::ParsingContext::parse(mbgl::style::conversion::Convertible const&, std::experimental::optional<mbgl::style::expression::TypeAnnotationOption> const&) at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/expression/parsing_context.cpp:173
#31 0x000000010f9532d5 in mbgl::style::expression::ParsingContext::parseLayerPropertyExpression(mbgl::style::conversion::Convertible const&) at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/expression/parsing_context.cpp:256
#32 0x000000010f8d2e4b in mbgl::style::conversion::Converter<mbgl::style::PropertyValue<float>, void>::operator()(mbgl::style::conversion::Convertible const&, mbgl::style::conversion::Error&, bool, bool) const at /Users/distiller/project/vendor/mapbox-gl-native/src/mbgl/style/conversion/property_value.cpp:22
#33 0x000000010fa9ed0e in std::experimental::optional<mbgl::style::PropertyValue<float> > mbgl::style::conversion::convert<mbgl::style::PropertyValue<float>, bool&, bool>(mbgl::style::conversion::Convertible const&, mbgl::style::conversion::Error&, bool&, bool&&) [inlined] at /Users/distiller/project/vendor/mapbox-gl-native/include/mbgl/style/conversion_impl.hpp:301
#34 0x000000010fa9eced in std::__1::enable_if<!(std::is_same<mbgl::style::PropertyValue<float>, mbgl::style::ColorRampPropertyValue>::value), mbgl::style::PropertyValue<float> >::type MGLStyleValueTransformer<float, NSNumber* __strong, float, NSNumber* __strong>::toPropertyValue<mbgl::style::PropertyValue<float> >(NSExpression*, bool) at /Users/distiller/project/platform/darwin/src/MGLStyleValue_Private.h:97
#35 0x000000010fb63590 in -[MGLLineStyleLayer setLineOpacity:] at /Users/distiller/project/platform/darwin/src/MGLLineStyleLayer.mm:384
#36 0x000000010f4a24d7 in ViewController.drawBounds(_:) at /Users/boga/Work/Freelance/JS/RNMBGL/native-ios-bugreport/MapboxIOSBugreport/MapboxIOSBugreport/ViewController.swift:85

Configuration

Mapbox SDK versions:5.9.0 iOS/macOS versions:13.3 Device/simulator models:iPhone SE(2nd generation) simulator Xcode version:11.5

tsuz commented 4 years ago

I am also able to reproduce this.

layer.lineColor = NSExpression(mglJSONObject: [
            "case",
            ["all", true, false],
            UIColor(red: 59/255, green: 178/255, blue: 208/255, alpha: 1),

            // comment these two line below and it does not crash
            ["all", 1, 2],
            UIColor.blue,

            UIColor.red
        ])

Reproduce Steps

  1. Clone this branch https://github.com/mapbox/ios-sdk-examples/tree/case-crash
  2. Run the example
  3. Tap "Add a line style layer from GeoJSON" menu for Swift
  4. Crashes

Expected

It should evaluate the expression and not crash the app.

Observed

It crashes the app.

To not reproduce

Comment out these two lines https://github.com/mapbox/ios-sdk-examples/commit/1745fe56de03da41b9a364a934f868f49bb8f3ec#diff-2450e949bfb839d24a2060f5d371c56aR75-R77 and repeat the reproduce steps. This does not crash the app.

Other Details

Is there another way of writing this?

tsuz commented 4 years ago

Not sure why case is not supported when nested but it's recommended to use TERNARY or MGL_IF (link) Some top level functions are broken and TERNARY should work according to here. So using TERNARY, it would look like:


           TERNARY(
                true = false,
                %@,
                %@
            )

And a workaround implementation would be:

layer.lineColor = NSExpression(format:
            """
            TERNARY(
                true = false,
                TERNARY(
                    1 = 2,
                    %@,
                    %@
                ),
                TERNARY(
                    2 = 2,
                    %@,
                    %@
                )
            )
            """, UIColor.blue, UIColor.purple, UIColor.red, UIColor.orange)