diff --git a/contrib/src/dbus-cpp/dbus-c++-gcc4.7.patch b/contrib/src/dbus-cpp/0001-dbus-c++-gcc4.7.patch similarity index 100% rename from contrib/src/dbus-cpp/dbus-c++-gcc4.7.patch rename to contrib/src/dbus-cpp/0001-dbus-c++-gcc4.7.patch diff --git a/contrib/src/dbus-cpp/dbus-c++-threading.patch b/contrib/src/dbus-cpp/0002-dbus-c++-threading.patch similarity index 100% rename from contrib/src/dbus-cpp/dbus-c++-threading.patch rename to contrib/src/dbus-cpp/0002-dbus-c++-threading.patch diff --git a/contrib/src/dbus-cpp/dbus-c++-writechar.patch b/contrib/src/dbus-cpp/0003-dbus-c++-writechar.patch similarity index 100% rename from contrib/src/dbus-cpp/dbus-c++-writechar.patch rename to contrib/src/dbus-cpp/0003-dbus-c++-writechar.patch diff --git a/contrib/src/dbus-cpp/0004-g++12.patch b/contrib/src/dbus-cpp/0004-g++12.patch new file mode 100644 index 0000000000000000000000000000000000000000..306a576cf52a34da4d923cf8614ebcfd969a6112 --- /dev/null +++ b/contrib/src/dbus-cpp/0004-g++12.patch @@ -0,0 +1,71 @@ +[dbus-c++] rearrange some deckchairs in types.h + +clang requires that when you invoke an operator with type-based dispatch, the +variant for the type you are invoking it on has already been pre-declared; this +bites us in the Variant T() operator, which relies on the overloaded '>>' +operator for MessageIter; we invoke >> on some type T, but >> for T is declared +later in the file. + +To hack around this, switch over to just forward-declaring the existence of the +T() operator, and put the body of the T() operator after all the +declarations/definitions of MessageIter >> operators. Also, shuffle the Variant +MessageIter >> operator to be above the map >> operator, since if someone tries +to invoke >> on a map of variants, they'll have the same problem. + +There will probably be other, similar problems requiring more rearrangements in +future. + +BUG=chromium-os:37776 +TEST=trybot + +Change-Id: I024ec58d427d960372d92ecaa48f711b4569778f +Signed-off-by: Elly Fong-Jones <ellyjones@chromium.org> +Reviewed-on: https://gerrit.chromium.org/gerrit/41576 +Reviewed-by: Guozhi Wei <carrot@google.com> +Reviewed-by: Ryan Sleevi <rsleevi@chromium.org> + +diff --git a/include/dbus-c++/types.h b/include/dbus-c++/types.h +index a11149a..72606f6 100644 +--- a/include/dbus-c++/types.h ++++ b/include/dbus-c++/types.h + +@@ -103,13 +103,7 @@ + } + + template <typename T> +- operator T() const +- { +- T cast; +- MessageIter ri = _msg.reader(); +- ri >> cast; +- return cast; +- } ++ operator T() const; + + private: + +@@ -440,6 +434,8 @@ + return ++iter; + } + ++extern DXXAPI DBus::MessageIter &operator >> (DBus::MessageIter &iter, DBus::Variant &val); ++ + template<typename E> + inline DBus::MessageIter &operator >> (DBus::MessageIter &iter, std::vector<E>& val) + { +@@ -521,6 +517,14 @@ + return ++iter; + } + +-extern DXXAPI DBus::MessageIter &operator >> (DBus::MessageIter &iter, DBus::Variant &val); ++template <typename T> ++inline DBus::Variant::operator T() const ++{ ++ T cast; ++ DBus::MessageIter ri = _msg.reader(); ++ ri >> cast; ++ return cast; ++} ++ + + #endif//__DBUSXX_TYPES_H diff --git a/contrib/src/dbus-cpp/0005-g++12-part2.patch b/contrib/src/dbus-cpp/0005-g++12-part2.patch new file mode 100644 index 0000000000000000000000000000000000000000..92a4dea0a859525fbd7e9966bcaad6739ce6eb63 --- /dev/null +++ b/contrib/src/dbus-cpp/0005-g++12-part2.patch @@ -0,0 +1,109 @@ +[dbus-c++] DBus-C++ operator overloading should rely on ADL + +DBus-C++ operator overloading (operator >>/<<) should rely on +argument-dependent lookup, rather than on sticking the overloads in the +global namespace, so that they can always be found correctly when used in +templates. + +See http://clang.llvm.org/compatibility.html#dep_lookup to understand why the +existing behaviour was incorrect + +BUG=none +TEST=Compile against types.h with Clang + +Change-Id: I9239e960f6872f0f312561050d1bbd4cc9b87458 +Reviewed-on: https://gerrit.chromium.org/gerrit/42027 +Tested-by: Liam McLoughlin <lmcloughlin@chromium.org> +Commit-Queue: Ryan Sleevi <rsleevi@chromium.org> +Reviewed-by: Ryan Sleevi <rsleevi@chromium.org> + +diff --git a/include/dbus-c++/types.h b/include/dbus-c++/types.h +index 9acb0a3..6652cd4 100644 +--- a/include/dbus-c++/types.h ++++ b/include/dbus-c++/types.h +@@ -310,7 +310,7 @@ struct type< Struct<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, + } + }; + +-} /* namespace DBus */ ++extern DXXAPI DBus::MessageIter &operator << (DBus::MessageIter &iter, const DBus::Variant &val); + + inline DBus::MessageIter &operator << (DBus::MessageIter &iter, const DBus::Invalid &) + { +@@ -649,6 +649,7 @@ inline DBus::Variant::operator T() const + return cast; + } + ++} /* namespace DBus */ + + #endif//__DBUSXX_TYPES_H + +diff --git a/src/types.cpp b/src/types.cpp +index d414a3e..70f9ac0 100644 +--- a/src/types.cpp ++++ b/src/types.cpp +@@ -34,7 +34,7 @@ + #include "message_p.h" + #include "internalerror.h" + +-using namespace DBus; ++namespace DBus { + + Variant::Variant() + : _msg(CallMessage()) // dummy message used as temporary storage for variant data +@@ -104,3 +104,4 @@ MessageIter &operator >> (MessageIter &iter, Variant &val) + return ++iter; + } + ++} /* namespace DBus */ +diff --git a/tools/xml.cpp b/tools/xml.cpp +index d3cc3ab..e21f7f5 100644 +--- a/tools/xml.cpp ++++ b/tools/xml.cpp +@@ -26,6 +26,10 @@ + + #include <expat.h> + ++namespace DBus { ++ ++namespace Xml { ++ + std::istream &operator >> (std::istream &in, DBus::Xml::Document &doc) + { + std::stringbuf xmlbuf; +@@ -40,9 +44,6 @@ std::ostream &operator << (std::ostream &out, const DBus::Xml::Document &doc) + return out << doc.to_xml(); + } + +-using namespace DBus; +-using namespace DBus::Xml; +- + Error::Error(const char *error, int line, int column) + { + std::ostringstream estream; +@@ -311,3 +312,6 @@ void Document::Expat::end_element_handler(void *data, const XML_Char *name) + doc->_depth--; + } + ++} /* namespace Xml */ ++ ++} /* namespace DBus */ +diff --git a/tools/xml.h b/tools/xml.h +index 736a0dd..7edb65c 100644 +--- a/tools/xml.h ++++ b/tools/xml.h +@@ -134,11 +134,11 @@ private: + int _depth; + }; + ++std::istream &operator >> (std::istream &, DBus::Xml::Document &); ++std::ostream &operator << (std::ostream &, DBus::Xml::Document &); ++ + } /* namespace Xml */ + + } /* namespace DBus */ + +-std::istream &operator >> (std::istream &, DBus::Xml::Document &); +-std::ostream &operator << (std::ostream &, DBus::Xml::Document &); +- + #endif//__DBUSXX_XML_H diff --git a/contrib/src/dbus-cpp/rules.mak b/contrib/src/dbus-cpp/rules.mak index a2b1e70f18b2d8ab4b68380674e0d648c999b353..28c9c37afaee7b04ba41b0bb0bb424e922f0f806 100644 --- a/contrib/src/dbus-cpp/rules.mak +++ b/contrib/src/dbus-cpp/rules.mak @@ -20,9 +20,11 @@ $(TARBALLS)/libdbus-c++-${DBUS_CPP_VERSION}.tar.gz: dbus-cpp: $(TARBALLS)/libdbus-c++-${DBUS_CPP_VERSION}.tar.gz .sum-dbus-cpp $(UNPACK) - $(APPLY) $(SRC)/dbus-cpp/dbus-c++-threading.patch - $(APPLY) $(SRC)/dbus-cpp/dbus-c++-writechar.patch - $(APPLY) $(SRC)/dbus-cpp/dbus-c++-gcc4.7.patch + $(APPLY) $(SRC)/dbus-cpp/0001-dbus-c++-gcc4.7.patch + $(APPLY) $(SRC)/dbus-cpp/0002-dbus-c++-threading.patch + $(APPLY) $(SRC)/dbus-cpp/0003-dbus-c++-writechar.patch + $(APPLY) $(SRC)/dbus-cpp/0004-g++12.patch + $(APPLY) $(SRC)/dbus-cpp/0005-g++12-part2.patch $(UPDATE_AUTOCONFIG) $(MOVE)