← Back to team overview

widelands-dev team mailing list archive

[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