mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Marked all fmt + va_list functions with format attribute so GCC/Clang can warn about them. Not ignoring -Wsuggest-attribute=format anymore for GCC/Clang.
This commit is contained in:
		| @@ -582,7 +582,6 @@ | |||||||
| #pragma GCC diagnostic ignored "-Wconversion"               // warning: conversion to 'xxxx' from 'xxxx' may alter its value | #pragma GCC diagnostic ignored "-Wconversion"               // warning: conversion to 'xxxx' from 'xxxx' may alter its value | ||||||
| #pragma GCC diagnostic ignored "-Wcast-qual"                // warning: cast from type 'xxxx' to type 'xxxx' casts away qualifiers | #pragma GCC diagnostic ignored "-Wcast-qual"                // warning: cast from type 'xxxx' to type 'xxxx' casts away qualifiers | ||||||
| #pragma GCC diagnostic ignored "-Wformat-nonliteral"        // warning: format not a string literal, format string not checked | #pragma GCC diagnostic ignored "-Wformat-nonliteral"        // warning: format not a string literal, format string not checked | ||||||
| #pragma GCC diagnostic ignored "-Wsuggest-attribute=format" |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------- | //------------------------------------------------------------------------- | ||||||
|   | |||||||
							
								
								
									
										70
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -31,9 +31,11 @@ | |||||||
|  |  | ||||||
| // Some compilers support applying printf-style warnings to user functions. | // Some compilers support applying printf-style warnings to user functions. | ||||||
| #if defined(__clang__) || defined(__GNUC__) | #if defined(__clang__) || defined(__GNUC__) | ||||||
| #define IM_PRINTFARGS(FMT) __attribute__((format(printf, FMT, (FMT+1)))) | #define IM_FMTARGS(FMT) __attribute__((format(printf, FMT, FMT+1))) | ||||||
|  | #define IM_FMTLIST(FMT) __attribute__((format(printf, FMT, 0))) | ||||||
| #else | #else | ||||||
| #define IM_PRINTFARGS(FMT) | #define IM_FMTARGS(FMT) | ||||||
|  | #define IM_FMTLIST(FMT) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #if defined(__clang__) | #if defined(__clang__) | ||||||
| @@ -242,34 +244,36 @@ namespace ImGui | |||||||
|     IMGUI_API int           GetColumnsCount(); |     IMGUI_API int           GetColumnsCount(); | ||||||
|  |  | ||||||
|     // ID scopes |     // ID scopes | ||||||
|     // If you are creating widgets in a loop you most likely want to push a unique identifier so ImGui can differentiate them. |     // If you are creating widgets in a loop you most likely want to push a unique identifier (e.g. object pointer, loop index) so ImGui can differentiate them. | ||||||
|     // You can also use the "##foobar" syntax within widget label to distinguish them from each others. Read "A primer on the use of labels/IDs" in the FAQ for more details. |     // You can also use the "##foobar" syntax within widget label to distinguish them from each others. Read "A primer on the use of labels/IDs" in the FAQ for more details. | ||||||
|     IMGUI_API void          PushID(const char* str_id);                                         // push identifier into the ID stack. IDs are hash of the *entire* stack! |     IMGUI_API void          PushID(const char* str_id);                                         // push identifier into the ID stack. IDs are hash of the entire stack! | ||||||
|     IMGUI_API void          PushID(const char* str_id_begin, const char* str_id_end); |     IMGUI_API void          PushID(const char* str_id_begin, const char* str_id_end); | ||||||
|     IMGUI_API void          PushID(const void* ptr_id); |     IMGUI_API void          PushID(const void* ptr_id); | ||||||
|     IMGUI_API void          PushID(int int_id); |     IMGUI_API void          PushID(int int_id); | ||||||
|     IMGUI_API void          PopID(); |     IMGUI_API void          PopID(); | ||||||
|     IMGUI_API ImGuiID       GetID(const char* str_id);                                          // calculate unique ID (hash of whole ID stack + given parameter). useful if you want to query into ImGuiStorage yourself |     IMGUI_API ImGuiID       GetID(const char* str_id);                                          // calculate unique ID (hash of whole ID stack + given parameter). e.g. if you want to query into ImGuiStorage yourself | ||||||
|     IMGUI_API ImGuiID       GetID(const char* str_id_begin, const char* str_id_end); |     IMGUI_API ImGuiID       GetID(const char* str_id_begin, const char* str_id_end); | ||||||
|     IMGUI_API ImGuiID       GetID(const void* ptr_id); |     IMGUI_API ImGuiID       GetID(const void* ptr_id); | ||||||
|  |  | ||||||
|     // Widgets |     // Widgets: Text | ||||||
|     IMGUI_API void          Text(const char* fmt, ...) IM_PRINTFARGS(1); |     IMGUI_API void          TextUnformatted(const char* text, const char* text_end = NULL);               // doesn't require null terminated string if 'text_end' is specified. no copy done, no limits, recommended for long chunks of text | ||||||
|     IMGUI_API void          TextV(const char* fmt, va_list args); |     IMGUI_API void          Text(const char* fmt, ...)                                     IM_FMTARGS(1); // simple formatted text | ||||||
|     IMGUI_API void          TextColored(const ImVec4& col, const char* fmt, ...) IM_PRINTFARGS(2);  // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor(); |     IMGUI_API void          TextV(const char* fmt, va_list args)                           IM_FMTLIST(1); | ||||||
|     IMGUI_API void          TextColoredV(const ImVec4& col, const char* fmt, va_list args); |     IMGUI_API void          TextColored(const ImVec4& col, const char* fmt, ...)           IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor(); | ||||||
|     IMGUI_API void          TextDisabled(const char* fmt, ...) IM_PRINTFARGS(1);                    // shortcut for PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); Text(fmt, ...); PopStyleColor(); |     IMGUI_API void          TextColoredV(const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(2); | ||||||
|     IMGUI_API void          TextDisabledV(const char* fmt, va_list args); |     IMGUI_API void          TextDisabled(const char* fmt, ...)                             IM_FMTARGS(1); // shortcut for PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); Text(fmt, ...); PopStyleColor(); | ||||||
|     IMGUI_API void          TextWrapped(const char* fmt, ...) IM_PRINTFARGS(1);                     // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize(). |     IMGUI_API void          TextDisabledV(const char* fmt, va_list args)                   IM_FMTLIST(1); | ||||||
|     IMGUI_API void          TextWrappedV(const char* fmt, va_list args); |     IMGUI_API void          TextWrapped(const char* fmt, ...)                              IM_FMTARGS(1); // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize(). | ||||||
|     IMGUI_API void          TextUnformatted(const char* text, const char* text_end = NULL);         // doesn't require null terminated string if 'text_end' is specified. no copy done to any bounded stack buffer, recommended for long chunks of text |     IMGUI_API void          TextWrappedV(const char* fmt, va_list args)                    IM_FMTLIST(1); | ||||||
|     IMGUI_API void          LabelText(const char* label, const char* fmt, ...) IM_PRINTFARGS(2);    // display text+label aligned the same way as value+label widgets |     IMGUI_API void          LabelText(const char* label, const char* fmt, ...)             IM_FMTARGS(2); // display text+label aligned the same way as value+label widgets | ||||||
|     IMGUI_API void          LabelTextV(const char* label, const char* fmt, va_list args); |     IMGUI_API void          LabelTextV(const char* label, const char* fmt, va_list args)   IM_FMTLIST(2); | ||||||
|  |     IMGUI_API void          BulletText(const char* fmt, ...)                               IM_FMTARGS(1); // shortcut for Bullet()+Text() | ||||||
|  |     IMGUI_API void          BulletTextV(const char* fmt, va_list args)                     IM_FMTLIST(1); | ||||||
|     IMGUI_API void          Bullet();                                                                     // draw a small circle and keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses |     IMGUI_API void          Bullet();                                                                     // draw a small circle and keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses | ||||||
|     IMGUI_API void          BulletText(const char* fmt, ...) IM_PRINTFARGS(1);                      // shortcut for Bullet()+Text() |  | ||||||
|     IMGUI_API void          BulletTextV(const char* fmt, va_list args); |     // Widgets: Main | ||||||
|     IMGUI_API bool          Button(const char* label, const ImVec2& size = ImVec2(0,0));            // button |     IMGUI_API bool          Button(const char* label, const ImVec2& size = ImVec2(0,0));            // button | ||||||
|     IMGUI_API bool          SmallButton(const char* label);                                         // button with FramePadding=(0,0) to easily embed in text |     IMGUI_API bool          SmallButton(const char* label);                                         // button with FramePadding=(0,0) to easily embed within text | ||||||
|     IMGUI_API bool          InvisibleButton(const char* str_id, const ImVec2& size); |     IMGUI_API bool          InvisibleButton(const char* str_id, const ImVec2& size); | ||||||
|     IMGUI_API void          Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0)); |     IMGUI_API void          Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0)); | ||||||
|     IMGUI_API bool          ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0),  const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1));    // <0 frame_padding uses default frame padding settings. 0 for no padding |     IMGUI_API bool          ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0),  const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1));    // <0 frame_padding uses default frame padding settings. 0 for no padding | ||||||
| @@ -335,15 +339,15 @@ namespace ImGui | |||||||
|  |  | ||||||
|     // Widgets: Trees |     // Widgets: Trees | ||||||
|     IMGUI_API bool          TreeNode(const char* label);                                            // if returning 'true' the node is open and the tree id is pushed into the id stack. user is responsible for calling TreePop(). |     IMGUI_API bool          TreeNode(const char* label);                                            // if returning 'true' the node is open and the tree id is pushed into the id stack. user is responsible for calling TreePop(). | ||||||
|     IMGUI_API bool          TreeNode(const char* str_id, const char* fmt, ...) IM_PRINTFARGS(2);    // read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet(). |     IMGUI_API bool          TreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(2);       // read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet(). | ||||||
|     IMGUI_API bool          TreeNode(const void* ptr_id, const char* fmt, ...) IM_PRINTFARGS(2);    // " |     IMGUI_API bool          TreeNode(const void* ptr_id, const char* fmt, ...) IM_FMTARGS(2);       // " | ||||||
|     IMGUI_API bool          TreeNodeV(const char* str_id, const char* fmt, va_list args);           // " |     IMGUI_API bool          TreeNodeV(const char* str_id, const char* fmt, va_list args) IM_FMTLIST(2); | ||||||
|     IMGUI_API bool          TreeNodeV(const void* ptr_id, const char* fmt, va_list args);           // " |     IMGUI_API bool          TreeNodeV(const void* ptr_id, const char* fmt, va_list args) IM_FMTLIST(2); | ||||||
|     IMGUI_API bool          TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags = 0); |     IMGUI_API bool          TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags = 0); | ||||||
|     IMGUI_API bool          TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_PRINTFARGS(3); |     IMGUI_API bool          TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); | ||||||
|     IMGUI_API bool          TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_PRINTFARGS(3); |     IMGUI_API bool          TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); | ||||||
|     IMGUI_API bool          TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args); |     IMGUI_API bool          TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); | ||||||
|     IMGUI_API bool          TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args); |     IMGUI_API bool          TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); | ||||||
|     IMGUI_API void          TreePush(const char* str_id = NULL);                                    // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call Push/Pop yourself for layout purpose |     IMGUI_API void          TreePush(const char* str_id = NULL);                                    // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call Push/Pop yourself for layout purpose | ||||||
|     IMGUI_API void          TreePush(const void* ptr_id = NULL);                                    // " |     IMGUI_API void          TreePush(const void* ptr_id = NULL);                                    // " | ||||||
|     IMGUI_API void          TreePop();                                                              // ~ Unindent()+PopId() |     IMGUI_API void          TreePop();                                                              // ~ Unindent()+PopId() | ||||||
| @@ -369,8 +373,8 @@ namespace ImGui | |||||||
|     IMGUI_API void          Value(const char* prefix, float v, const char* float_format = NULL); |     IMGUI_API void          Value(const char* prefix, float v, const char* float_format = NULL); | ||||||
|  |  | ||||||
|     // Tooltips |     // Tooltips | ||||||
|     IMGUI_API void          SetTooltip(const char* fmt, ...) IM_PRINTFARGS(1);                  // set text tooltip under mouse-cursor, typically use with ImGui::IsItemHovered(). overidde any previous call to SetTooltip(). |     IMGUI_API void          SetTooltip(const char* fmt, ...) IM_FMTARGS(1);                     // set text tooltip under mouse-cursor, typically use with ImGui::IsItemHovered(). overidde any previous call to SetTooltip(). | ||||||
|     IMGUI_API void          SetTooltipV(const char* fmt, va_list args); |     IMGUI_API void          SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); | ||||||
|     IMGUI_API void          BeginTooltip();                                                     // begin/append a tooltip window. to create full-featured tooltip (with any kind of contents). |     IMGUI_API void          BeginTooltip();                                                     // begin/append a tooltip window. to create full-featured tooltip (with any kind of contents). | ||||||
|     IMGUI_API void          EndTooltip(); |     IMGUI_API void          EndTooltip(); | ||||||
|  |  | ||||||
| @@ -401,7 +405,7 @@ namespace ImGui | |||||||
|     IMGUI_API void          LogToClipboard(int max_depth = -1);                                 // start logging to OS clipboard |     IMGUI_API void          LogToClipboard(int max_depth = -1);                                 // start logging to OS clipboard | ||||||
|     IMGUI_API void          LogFinish();                                                        // stop logging (close file, etc.) |     IMGUI_API void          LogFinish();                                                        // stop logging (close file, etc.) | ||||||
|     IMGUI_API void          LogButtons();                                                       // helper to display buttons for logging to tty/file/clipboard |     IMGUI_API void          LogButtons();                                                       // helper to display buttons for logging to tty/file/clipboard | ||||||
|     IMGUI_API void          LogText(const char* fmt, ...) IM_PRINTFARGS(1);                     // pass text data straight to log (without being displayed) |     IMGUI_API void          LogText(const char* fmt, ...) IM_FMTARGS(1);                        // pass text data straight to log (without being displayed) | ||||||
|  |  | ||||||
|     // Clipping |     // Clipping | ||||||
|     IMGUI_API void          PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect); |     IMGUI_API void          PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect); | ||||||
| @@ -996,8 +1000,8 @@ struct ImGuiTextBuffer | |||||||
|     bool                empty() { return Buf.Size <= 1; } |     bool                empty() { return Buf.Size <= 1; } | ||||||
|     void                clear() { Buf.clear(); Buf.push_back(0); } |     void                clear() { Buf.clear(); Buf.push_back(0); } | ||||||
|     const char*         c_str() const { return Buf.Data; } |     const char*         c_str() const { return Buf.Data; } | ||||||
|     IMGUI_API void      append(const char* fmt, ...) IM_PRINTFARGS(2); |     IMGUI_API void      append(const char* fmt, ...) IM_FMTARGS(2); | ||||||
|     IMGUI_API void      appendv(const char* fmt, va_list args); |     IMGUI_API void      appendv(const char* fmt, va_list args) IM_FMTLIST(2); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Helper: Simple Key->value storage | // Helper: Simple Key->value storage | ||||||
|   | |||||||
| @@ -2298,7 +2298,7 @@ struct ExampleAppConsole | |||||||
|         ScrollToBottom = true; |         ScrollToBottom = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void    AddLog(const char* fmt, ...) IM_PRINTFARGS(2) |     void    AddLog(const char* fmt, ...) IM_FMTARGS(2) | ||||||
|     { |     { | ||||||
|         char buf[1024]; |         char buf[1024]; | ||||||
|         va_list args; |         va_list args; | ||||||
| @@ -2560,7 +2560,7 @@ struct ExampleAppLog | |||||||
|  |  | ||||||
|     void    Clear()     { Buf.clear(); LineOffsets.clear(); } |     void    Clear()     { Buf.clear(); LineOffsets.clear(); } | ||||||
|  |  | ||||||
|     void    AddLog(const char* fmt, ...) IM_PRINTFARGS(2) |     void    AddLog(const char* fmt, ...) IM_FMTARGS(2) | ||||||
|     { |     { | ||||||
|         int old_size = Buf.size(); |         int old_size = Buf.size(); | ||||||
|         va_list args; |         va_list args; | ||||||
|   | |||||||
| @@ -109,8 +109,8 @@ IMGUI_API char*         ImStrdup(const char* str); | |||||||
| IMGUI_API int           ImStrlenW(const ImWchar* str); | IMGUI_API int           ImStrlenW(const ImWchar* str); | ||||||
| IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line | IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line | ||||||
| IMGUI_API const char*   ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); | IMGUI_API const char*   ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); | ||||||
| IMGUI_API int           ImFormatString(char* buf, int buf_size, const char* fmt, ...) IM_PRINTFARGS(3); | IMGUI_API int           ImFormatString(char* buf, int buf_size, const char* fmt, ...) IM_FMTARGS(3); | ||||||
| IMGUI_API int           ImFormatStringV(char* buf, int buf_size, const char* fmt, va_list args); | IMGUI_API int           ImFormatStringV(char* buf, int buf_size, const char* fmt, va_list args) IM_FMTLIST(3); | ||||||
|  |  | ||||||
| // Helpers: Math | // Helpers: Math | ||||||
| // We are keeping those not leaking to the user by default, in the case the user has implicit cast operators between ImVec2 and its own types (when IM_VEC2_CLASS_EXTRA is defined) | // We are keeping those not leaking to the user by default, in the case the user has implicit cast operators between ImVec2 and its own types (when IM_VEC2_CLASS_EXTRA is defined) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 omar
					omar