widelands-dev team mailing list archive
-
widelands-dev team
-
Mailing list archive
-
Message #10466
[Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
Klaus Halfmann has proposed merging lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands.
Requested reviews:
GunChleoc (gunchleoc)
For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/compiler_warnings_20170619/+merge/325952
This is the alternative for compiler_warnings_062017.
Lets check if this branch will make it to git and finally to travis.
Gun and I will update this description once travis is working again.
--
Your team Widelands Developers is subscribed to branch lp:~widelands-dev/widelands/compiler_warnings_20170619.
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt 2017-06-15 15:45:01 +0000
+++ CMakeLists.txt 2017-06-19 18:37:03 +0000
@@ -127,9 +127,17 @@
wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-padded")
wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-sign-conversion")
wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-missing-noreturn")
+ # NOCOM wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-disabled-macro-expansion")
+ # NOCOM wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-format-pedantic")
+
+ # It is impossible to write code that both GCC and Clang will like,
+ # so we have to switch off the warning for one of them.
+ # http://clang-developers.42468.n3.nabble.com/Question-on-Wswitch-enum-td4025927.html
+ wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-switch-enum")
# TODO(sirver): weak-vtables should be enabled, but leads to lot of errors right now.
wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-weak-vtables")
+
wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-unreachable-code")
wl_add_flag(WL_COMPILE_DIAGNOSTICS "-Wno-documentation")
=== modified file 'src/base/wexception.h'
--- src/base/wexception.h 2017-01-25 18:55:59 +0000
+++ src/base/wexception.h 2017-06-19 18:37:03 +0000
@@ -36,12 +36,12 @@
#endif
#endif
-/** class wexception
+/** Stupid, simple exception class.
*
- * Stupid, simple exception class. It has the nice bonus that you can give it
- * sprintf()-style format strings
+ * It has the nice bonus that you can give it sprintf()-style format strings.
*/
-struct WException : public std::exception {
+class WException : public std::exception {
+ public:
explicit WException(char const* const file, uint32_t const line, char const* const fmt, ...)
PRINTF_FORMAT(4, 5);
@@ -51,7 +51,7 @@
*/
const char* what() const noexcept override;
-protected:
+ protected:
WException() {
}
std::string what_;
=== modified file 'src/economy/economy.cc'
--- src/economy/economy.cc 2017-02-12 09:10:57 +0000
+++ src/economy/economy.cc 2017-06-19 18:37:03 +0000
@@ -431,7 +431,9 @@
RequestList::iterator const it = std::find(requests_.begin(), requests_.end(), &req);
if (it == requests_.end()) {
+ DIAG_OFF("-Wformat");
log("WARNING: remove_request(%p) not in list\n", &req);
+ DIAG_ON("-Wformat");
return;
}
=== modified file 'src/economy/ware_instance.cc'
--- src/economy/ware_instance.cc 2017-04-23 12:11:19 +0000
+++ src/economy/ware_instance.cc 2017-06-19 18:37:03 +0000
@@ -187,7 +187,9 @@
WareInstance::~WareInstance() {
if (supply_) {
+ DIAG_OFF("-Wformat");
molog("Ware %u still has supply %p\n", descr_index_, supply_);
+ DIAG_ON("-Wformat");
delete supply_;
}
}
=== modified file 'src/graphic/animation.cc'
--- src/graphic/animation.cc 2017-05-31 21:27:07 +0000
+++ src/graphic/animation.cc 2017-06-19 18:37:03 +0000
@@ -150,7 +150,7 @@
if (table.has_key("scale")) {
scale_ = table.get_double("scale");
if (scale_ <= 0.0f) {
- throw wexception("Animation scale needs to be > 0.0f, but it is %f. The first image of "
+ throw wexception("Animation scale needs to be > 0.0f, but it is %2.2f. The first image of "
"this animation is %s",
scale_, image_files_[0].c_str());
}
=== modified file 'src/graphic/text/bidi.cc'
--- src/graphic/text/bidi.cc 2017-02-18 14:03:02 +0000
+++ src/graphic/text/bidi.cc 2017-06-19 18:37:03 +0000
@@ -492,7 +492,9 @@
// True if the character is in one of the script's code blocks
bool is_script_character(UChar32 c, UI::FontSets::Selector script) {
+ CLANG_DIAG_OFF("-Wdisabled-macro-expansion")
UBlockCode code = ublock_getCode(c);
+ CLANG_DIAG_ON("-Wdisabled-macro-expansion")
if (kRTLCodeBlocks.count(script) == 1 && kRTLCodeBlocks.at(script).count(code) == 1) {
return true;
}
@@ -503,7 +505,9 @@
}
bool is_rtl_character(UChar32 c) {
+ CLANG_DIAG_OFF("-Wdisabled-macro-expansion")
UBlockCode code = ublock_getCode(c);
+ CLANG_DIAG_ON("-Wdisabled-macro-expansion")
for (UI::FontSets::Selector script : kRTLScripts) {
assert(kRTLCodeBlocks.count(script) == 1);
if ((kRTLCodeBlocks.at(script).count(code) == 1)) {
=== modified file 'src/io/filesystem/filesystem_exceptions.h'
--- src/io/filesystem/filesystem_exceptions.h 2017-01-25 18:55:59 +0000
+++ src/io/filesystem/filesystem_exceptions.h 2017-06-19 18:37:03 +0000
@@ -26,7 +26,8 @@
/**
* Generic problem when dealing with a file or directory
*/
-struct FileError : public std::runtime_error {
+class FileError : public std::runtime_error {
+ public:
explicit FileError(const std::string& thrower,
const std::string& filename,
const std::string& message = "problem with file/directory")
@@ -39,7 +40,8 @@
* A file/directory could not be found. Either it really does not exist or there
* are problems with the path, e.g. loops or nonexistent path components
*/
-struct FileNotFoundError : public FileError {
+class FileNotFoundError : public FileError {
+ public:
explicit FileNotFoundError(const std::string& thrower,
const std::string& filename,
const std::string& message = "could not find file or directory")
@@ -51,7 +53,8 @@
/**
* The file/directory is of an unexpected type. Reasons can be given via message
*/
-struct FileTypeError : public FileError {
+class FileTypeError : public FileError {
+ public:
explicit FileTypeError(const std::string& thrower,
const std::string& filename,
const std::string& message = "file or directory has wrong type")
@@ -63,7 +66,8 @@
/**
* The operating system denied access to the file/directory in question
*/
-struct FileAccessDeniedError : public FileError {
+class FileAccessDeniedError : public FileError {
+ public:
explicit FileAccessDeniedError(const std::string& thrower,
const std::string& filename,
const std::string& message = "access denied on file or directory")
@@ -75,8 +79,8 @@
/**
* The directory cannot be created
*/
-
-struct DirectoryCannotCreateError : public FileError {
+class DirectoryCannotCreateError : public FileError {
+ public:
explicit DirectoryCannotCreateError(const std::string& thrower,
const std::string& dirname,
const std::string& message = "cannot create directory")
=== modified file 'src/io/streamread.h'
--- src/io/streamread.h 2017-01-25 18:55:59 +0000
+++ src/io/streamread.h 2017-06-19 18:37:03 +0000
@@ -75,7 +75,8 @@
/// Base of all exceptions that are caused by errors in the data that is
/// read.
- struct DataError : public WException {
+ class DataError : public WException {
+ public:
DataError(char const* const fmt, ...) PRINTF_FORMAT(2, 3);
};
#define data_error(...) DataError(__VA_ARGS__)
=== modified file 'src/logic/map_objects/bob.cc'
--- src/logic/map_objects/bob.cc 2017-04-23 12:11:19 +0000
+++ src/logic/map_objects/bob.cc 2017-06-19 18:37:03 +0000
@@ -901,7 +901,9 @@
/// Give debug information.
void Bob::log_general_info(const EditorGameBase& egbase) {
+ DIAG_OFF("-Wformat"); // GCC warnings can't handle polymorphy with void*
molog("Owner: %p\n", owner_);
+ DIAG_ON("-Wformat");
molog("Postition: (%i, %i)\n", position_.x, position_.y);
molog("ActID: %i\n", actid_);
molog("ActScheduled: %s\n", actscheduled_ ? "true" : "false");
@@ -926,7 +928,9 @@
molog("* ivar2: %i\n", stack_[i].ivar2);
molog("* ivar3: %i\n", stack_[i].ivar3);
+ DIAG_OFF("-Wformat");
molog("* object pointer: %p\n", stack_[i].objvar1.get(egbase));
+ DIAG_ON("-Wformat");
molog("* svar1: %s\n", stack_[i].svar1.c_str());
molog("* coords: (%i, %i)\n", stack_[i].coords.x, stack_[i].coords.y);
@@ -934,7 +938,9 @@
for (Direction dir = FIRST_DIRECTION; dir <= LAST_DIRECTION; ++dir) {
molog(" %d", stack_[i].diranims.get_animation(dir));
}
+ DIAG_OFF("-Wformat");
molog("\n* path: %p\n", stack_[i].path);
+ DIAG_ON("-Wformat");
if (stack_[i].path) {
const Path& path = *stack_[i].path;
Path::StepVector::size_type nr_steps = path.get_nsteps();
@@ -947,9 +953,10 @@
molog("* (%i, %i)\n", coords.x, coords.y);
}
}
+ DIAG_OFF("-Wformat");
molog("* route: %p\n", stack_[i].route);
-
molog("* program: %p\n", stack_[i].route);
+ DIAG_ON("-Wformat");
}
}
=== modified file 'src/logic/map_objects/immovable.cc'
--- src/logic/map_objects/immovable.cc 2017-06-15 22:00:08 +0000
+++ src/logic/map_objects/immovable.cc 2017-06-19 18:37:03 +0000
@@ -1329,10 +1329,14 @@
void PlayerImmovable::log_general_info(const EditorGameBase& egbase) {
BaseImmovable::log_general_info(egbase);
+ DIAG_OFF("-Wformat");
molog("this: %p\n", this);
molog("owner_: %p\n", owner_);
+ DIAG_ON("-Wformat");
molog("player_number: %i\n", owner_->player_number());
+ DIAG_OFF("-Wformat");
molog("economy_: %p\n", economy_);
+ DIAG_ON("-Wformat");
}
constexpr uint8_t kCurrentPacketVersionPlayerImmovable = 1;
=== modified file 'src/logic/map_objects/tribes/building.cc'
--- src/logic/map_objects/tribes/building.cc 2017-05-25 13:00:12 +0000
+++ src/logic/map_objects/tribes/building.cc 2017-06-19 18:37:03 +0000
@@ -672,7 +672,9 @@
PlayerImmovable::log_general_info(egbase);
molog("position: (%i, %i)\n", position_.x, position_.y);
+ DIAG_OFF("-Wformat");
molog("flag: %p\n", flag_);
+ DIAG_ON("-Wformat");
molog("* position: (%i, %i)\n", flag_->get_position().x, flag_->get_position().y);
molog("anim: %s\n", descr().get_animation_name(anim_).c_str());
@@ -681,7 +683,9 @@
molog("leave_time: %i\n", leave_time_);
molog("leave_queue.size(): %lu\n", static_cast<long unsigned int>(leave_queue_.size()));
+ DIAG_OFF("-Wformat");
molog("leave_allow.get(): %p\n", leave_allow_.get(egbase));
+ DIAG_ON("-Wformat");
}
void Building::add_worker(Worker& worker) {
=== modified file 'src/logic/map_objects/tribes/worker.cc'
--- src/logic/map_objects/tribes/worker.cc 2017-05-03 07:24:06 +0000
+++ src/logic/map_objects/tribes/worker.cc 2017-06-19 18:37:03 +0000
@@ -977,24 +977,34 @@
Bob::log_general_info(egbase);
if (upcast(PlayerImmovable, loc, location_.get(egbase))) {
+ DIAG_OFF("-Wformat");
molog("* Owner: (%p)\n", &loc->owner());
+ DIAG_ON("-Wformat");
molog("** Owner (plrnr): %i\n", loc->owner().player_number());
+ DIAG_OFF("-Wformat");
molog("* Economy: %p\n", loc->get_economy());
+ DIAG_ON("-Wformat");
}
PlayerImmovable* imm = location_.get(egbase);
molog("location: %u\n", imm ? imm->serial() : 0);
+ DIAG_OFF("-Wformat");
molog("Economy: %p\n", economy_);
molog("transfer: %p\n", transfer_);
+ DIAG_ON("-Wformat");
if (upcast(WareInstance, ware, carried_ware_.get(egbase))) {
molog("* carried_ware->get_ware() (id): %i\n", ware->descr_index());
+ DIAG_OFF("-Wformat");
molog("* carried_ware->get_economy() (): %p\n", ware->get_economy());
+ DIAG_ON("-Wformat");
}
molog("current_exp: %i / %i\n", current_exp_, descr().get_needed_experience());
+ DIAG_OFF("-Wformat");
molog("supply: %p\n", supply_);
+ DIAG_ON("-Wformat");
}
/**
=== modified file 'src/network/gamehost.cc'
--- src/network/gamehost.cc 2017-06-15 22:00:08 +0000
+++ src/network/gamehost.cc 2017-06-19 18:37:03 +0000
@@ -65,7 +65,7 @@
struct HostGameSettingsProvider : public GameSettingsProvider {
HostGameSettingsProvider(GameHost* const init_host)
- : host_(init_host), current_wincondition_(0) {
+ : host_(init_host) {
}
~HostGameSettingsProvider() {
}
@@ -275,7 +275,6 @@
private:
GameHost* host_;
- int16_t current_wincondition_;
std::vector<std::string> wincondition_scripts_;
};
=== modified file 'src/network/netclient.cc'
--- src/network/netclient.cc 2017-06-10 16:36:29 +0000
+++ src/network/netclient.cc 2017-06-19 18:37:03 +0000
@@ -68,8 +68,13 @@
return;
boost::system::error_code ec;
+#ifdef NDEBUG
+ boost::asio::write(socket_, boost::asio::buffer(packet.get_data(), packet.get_size()), ec);
+#else
size_t written =
boost::asio::write(socket_, boost::asio::buffer(packet.get_data(), packet.get_size()), ec);
+#endif
+
// TODO(Notabilis): This one is an assertion of mine, I am not sure if it will hold
// If it doesn't, set the socket to blocking before writing
// If it does, remove this comment after build 20
=== modified file 'src/network/nethost.cc'
--- src/network/nethost.cc 2017-06-10 16:36:29 +0000
+++ src/network/nethost.cc 2017-06-19 18:37:03 +0000
@@ -170,8 +170,14 @@
void NetHost::send(const ConnectionId id, const SendPacket& packet) {
boost::system::error_code ec;
if (is_connected(id)) {
+#ifdef NDEBUG
+ boost::asio::write(
+ clients_.at(id).socket, boost::asio::buffer(packet.get_data(), packet.get_size()), ec);
+#else
size_t written = boost::asio::write(
clients_.at(id).socket, boost::asio::buffer(packet.get_data(), packet.get_size()), ec);
+#endif
+
// TODO(Notabilis): This one is an assertion of mine, I am not sure if it will hold
// If it doesn't, set the socket to blocking before writing
// If it does, remove this comment after build 20
=== modified file 'src/scripting/lua_errors.cc'
--- src/scripting/lua_errors.cc 2017-01-25 18:55:59 +0000
+++ src/scripting/lua_errors.cc 2017-06-19 18:37:03 +0000
@@ -25,3 +25,4 @@
LuaScriptNotExistingError::LuaScriptNotExistingError(const std::string& name)
: LuaError("The script '" + name + "' was not found!") {
}
+
=== modified file 'src/scripting/lua_map.cc'
--- src/scripting/lua_map.cc 2017-04-05 14:19:14 +0000
+++ src/scripting/lua_map.cc 2017-06-19 18:37:03 +0000
@@ -4458,7 +4458,7 @@
report_error(L, "<%s> is no valid warehouse policy!", str.c_str());
}
-bool do_set_ware_policy(Warehouse* wh, const DescriptionIndex idx, const Warehouse::StockPolicy p) {
+inline bool do_set_ware_policy(Warehouse* wh, const DescriptionIndex idx, const Warehouse::StockPolicy p) {
wh->set_ware_policy(idx, p);
return true;
}
@@ -4467,7 +4467,7 @@
* Sets the given policy for the given ware in the given warehouse and return true.
* If the no ware with the given name exists for the tribe of the warehouse, return false.
*/
-bool do_set_ware_policy(Warehouse* wh, const std::string& name, const Warehouse::StockPolicy p) {
+inline bool do_set_ware_policy(Warehouse* wh, const std::string& name, const Warehouse::StockPolicy p) {
const TribeDescr& tribe = wh->owner().tribe();
DescriptionIndex idx = tribe.ware_index(name);
if (!tribe.has_ware(idx)) {
@@ -4476,7 +4476,7 @@
return do_set_ware_policy(wh, idx, p);
}
-bool do_set_worker_policy(Warehouse* wh,
+inline bool do_set_worker_policy(Warehouse* wh,
const DescriptionIndex idx,
const Warehouse::StockPolicy p) {
const TribeDescr& tribe = wh->owner().tribe();
@@ -4496,7 +4496,7 @@
* policy.
* If no worker with the given name exists for the tribe of the warehouse, return false.
*/
-bool do_set_worker_policy(Warehouse* wh, const std::string& name, const Warehouse::StockPolicy p) {
+inline bool do_set_worker_policy(Warehouse* wh, const std::string& name, const Warehouse::StockPolicy p) {
const TribeDescr& tribe = wh->owner().tribe();
DescriptionIndex idx = tribe.worker_index(name);
if (!tribe.has_worker(idx)) {
@@ -4566,11 +4566,11 @@
// Gets the warehouse policy by ware/worker-name or id
#define WH_GET_POLICY(type) \
- void do_get_##type##_policy(lua_State* L, Warehouse* wh, const DescriptionIndex idx) { \
+ inline void do_get_##type##_policy(lua_State* L, Warehouse* wh, const DescriptionIndex idx) { \
wh_policy_to_string(L, wh->get_##type##_policy(idx)); \
} \
\
- bool do_get_##type##_policy(lua_State* L, Warehouse* wh, const std::string& name) { \
+ inline bool do_get_##type##_policy(lua_State* L, Warehouse* wh, const std::string& name) { \
const TribeDescr& tribe = wh->owner().tribe(); \
DescriptionIndex idx = tribe.type##_index(name); \
if (!tribe.has_##type(idx)) { \
=== modified file 'src/scripting/test/test_luna.cc'
--- src/scripting/test/test_luna.cc 2017-01-25 18:55:59 +0000
+++ src/scripting/test/test_luna.cc 2017-06-19 18:37:03 +0000
@@ -53,8 +53,7 @@
}
LuaClass() : x(123), prop(246) {
}
- virtual ~LuaClass() {
- }
+ virtual ~LuaClass();
LuaClass(lua_State* /* L */) : x(124), prop(248) {
}
virtual int test(lua_State* L) {
@@ -78,6 +77,7 @@
void __unpersist(lua_State* /* L */) override {
}
};
+LuaClass::~LuaClass() { }
const char LuaClass::className[] = "Class";
const MethodType<LuaClass> LuaClass::Methods[] = {
METHOD(LuaClass, test), {nullptr, nullptr},
@@ -86,7 +86,7 @@
PROP_RO(LuaClass, propr)
, PROP_RW(LuaClass, prop1), END_LUNA_PROPERTIES()
- class LuaSubClass : public LuaClass {
+class LuaSubClass : public LuaClass {
int y;
public:
@@ -95,10 +95,7 @@
}
LuaSubClass(lua_State* L) : LuaClass(L), y(1240) {
}
- virtual int subtest(lua_State* L) {
- lua_pushuint32(L, y);
- return 1;
- }
+ virtual int subtest(lua_State* L);
void __persist(lua_State* /* L */) override {
}
void __unpersist(lua_State* /* L */) override {
@@ -111,6 +108,11 @@
BEGIN_LUNA_PROPERTIES(LuaSubClass)
END_LUNA_PROPERTIES()
+int LuaSubClass::subtest(lua_State* L) {
+ lua_pushuint32(L, y);
+ return 1;
+}
+
class LuaVirtualClass : public LuaClass {
int z;
@@ -120,10 +122,7 @@
}
LuaVirtualClass(lua_State* L) : LuaClass(L), z(12400) {
}
- virtual int virtualtest(lua_State* L) {
- lua_pushuint32(L, z);
- return 1;
- }
+ virtual int virtualtest(lua_State* L);
void __persist(lua_State* /* L */) override {
}
void __unpersist(lua_State* /* L */) override {
@@ -136,21 +135,26 @@
BEGIN_LUNA_PROPERTIES(LuaVirtualClass)
END_LUNA_PROPERTIES()
+int LuaVirtualClass::virtualtest(lua_State* L) {
+ lua_pushuint32(L, z);
+ return 1;
+}
+
class LuaSecond {
public:
int get_second(lua_State* L) {
lua_pushint32(L, 2001);
return 1;
}
- virtual ~LuaSecond() {
- }
-
+ virtual ~LuaSecond();
virtual int multitest(lua_State* L) {
lua_pushint32(L, 2002);
return 1;
}
};
+LuaSecond::~LuaSecond() { }
+
class LuaMultiClass : public LuaClass, public LuaSecond {
int z;
@@ -160,10 +164,7 @@
}
LuaMultiClass(lua_State* L) : LuaClass(L), z(12400) {
}
- virtual int virtualtest(lua_State* L) {
- lua_pushuint32(L, z);
- return 1;
- }
+ virtual int virtualtest(lua_State* L);
void __persist(lua_State* /* L */) override {
}
void __unpersist(lua_State* /* L */) override {
@@ -177,7 +178,12 @@
PROP_RO(LuaMultiClass, second)
, END_LUNA_PROPERTIES()
- const static struct luaL_Reg wltest[] = {{nullptr, nullptr}};
+int LuaMultiClass::virtualtest(lua_State* L) {
+ lua_pushuint32(L, z);
+ return 1;
+}
+
+const static struct luaL_Reg wltest[] = {{nullptr, nullptr}};
const static struct luaL_Reg wl[] = {{nullptr, nullptr}};
static int test_check_int(lua_State* L) {
=== modified file 'src/ui_basic/progressbar.cc'
--- src/ui_basic/progressbar.cc 2017-05-25 12:30:40 +0000
+++ src/ui_basic/progressbar.cc 2017-06-19 18:37:03 +0000
@@ -86,7 +86,7 @@
// Print the state in percent without decimal points.
const std::string progress_text = (boost::format("<font color=%s>%u%%</font>") %
- UI_FONT_CLR_BRIGHT.hex_value() % floor(fraction * 100.f))
+ UI_FONT_CLR_BRIGHT.hex_value() % floorf(fraction * 100.f))
.str();
std::shared_ptr<const UI::RenderedText> rendered_text =
UI::g_fh1->render(as_uifont(progress_text));
=== modified file 'src/ui_fsmenu/launch_spg.h'
--- src/ui_fsmenu/launch_spg.h 2017-02-10 14:12:36 +0000
+++ src/ui_fsmenu/launch_spg.h 2017-06-19 18:37:03 +0000
@@ -52,7 +52,7 @@
FullscreenMenuLaunchSPG(GameSettingsProvider*, GameController* = nullptr);
~FullscreenMenuLaunchSPG();
- void start();
+ void start() override;
void refresh() override;
protected:
Follow ups
-
[Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: noreply, 2017-06-23
-
Re: [Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: GunChleoc, 2017-06-23
-
Re: [Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: Klaus Halfmann, 2017-06-22
-
Re: [Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: GunChleoc, 2017-06-21
-
Re: [Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: Klaus Halfmann, 2017-06-21
-
Re: [Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: GunChleoc, 2017-06-20
-
Re: [Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: Klaus Halfmann, 2017-06-20
-
Re: [Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: GunChleoc, 2017-06-20
-
Re: [Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: GunChleoc, 2017-06-20
-
[Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: GunChleoc, 2017-06-20
-
[Merge] lp:~widelands-dev/widelands/compiler_warnings_20170619 into lp:widelands
From: bunnybot, 2017-06-19