if (find_global_symbol (name) >= 0) {
+ global_symbols[find_global_symbol (name)].is_static = (declaration_storage == STORAGE_STATIC);
+
set_global_symbol_size (name, declarator_is_pointer ? DATA_PTR : (parsed_type_is_void ? DATA_VOID : parsed_type_size));
set_global_symbol_pointer_info (name, declarator_effective_pointer_depth_now (),
declarator_effective_pointed_size_now (parsed_type_size, object_fields, object_field_count));
masm_flush_data_line ();
}
+ warn_undefined_static_functions (get_filename ());
warn_unused_static_functions (get_filename ());
+
emit_pending_extern_symbols ();
if (vec_dllexports.length || vec_dllaliases.length) {
#define WARN_FALLTHROUGH (1U << 8)
#define WARN_OLD_STYLE (1U << 9)
#define WARN_INITIALIZER (1U << 10)
+#define WARN_STATIC_UNDEFINED (1U << 11)
-#define WARN_DEFAULT (WARN_DUP_DEFINE)
+#define WARN_DEFAULT (WARN_DUP_DEFINE | WARN_STATIC_UNDEFINED)
#define WARN_ALL (WARN_DEFAULT | WARN_NO_RETURN | WARN_SIGNEDNESS | WARN_UNUSED | WARN_FALLTHROUGH | WARN_INITIALIZER)
#define WARN_EXTRA (WARN_ALL | WARN_CONVERSION | WARN_OLD_STYLE)
if (find_global_symbol (name) >= 0) {
+ global_symbols[find_global_symbol (name)].is_static = (declaration_storage == STORAGE_STATIC);
+
set_global_symbol_size (name, declarator_is_pointer ? DATA_PTR : (parsed_type_is_void ? DATA_VOID : parsed_type_size));
set_global_symbol_pointer_info (name, declarator_effective_pointer_depth_now (),
declarator_effective_pointed_size_now (parsed_type_size, object_fields, object_field_count));
masm_flush_data_line ();
}
+ warn_undefined_static_functions (get_filename ());
warn_unused_static_functions (get_filename ());
+
emit_pending_extern_symbols ();
if (vec_dllexports.length || vec_dllaliases.length) {
}
+void warn_undefined_static_functions (const char *filename) {
+
+ int i;
+
+ if (!state || !(state->warn & WARN_STATIC_UNDEFINED)) {
+ return;
+ }
+
+ for (i = 0; i < global_symbol_count; i++) {
+
+ struct global_symbol_entry *sym = &global_symbols[i];
+
+ if (sym->kind != GLOBAL_SYMBOL_FUNCTION || !sym->is_static || !sym->used || !sym->is_extern) {
+ continue;
+ }
+
+ if (sym->decl_start && sym->decl_line) {
+
+ report_line_at (sym->decl_filename ? sym->decl_filename : (filename ? filename : get_filename ()), sym->decl_line, REPORT_WARNING,
+ sym->decl_start, sym->decl_start + sym->decl_caret_offset, "'%s' used but never defined", sym->name);
+
+ } else {
+ report_at (filename ? filename : get_filename (), get_line_number (), REPORT_WARNING, "'%s' used but never defined", sym->name);
+ }
+
+ }
+
+}
+
void warn_unused_static_functions (const char *filename) {
int i;
void warn_shadow_symbol (const char *name, int scope_start_count, int line, const char *start, const char *caret, int is_parameter);
void warn_unused_local_symbols (int start, const char *filename);
void warn_unused_static_functions (const char *filename);
+void warn_undefined_static_functions (const char *filename);
#define MAX_GLOBAL_SYMBOLS 4096
int find_global_symbol (const char *name);