From 921877e8a4d7b5221762490d3f6e3b3666e4381b Mon Sep 17 00:00:00 2001 From: Dale Weiler Date: Sun, 30 Dec 2012 06:43:07 +0000 Subject: [PATCH] Implement [[deprecated]] general attribute, will mark functions as deprecated. Making calls to functions marked as such will trigger a compiler warning. Enabled by default. --- ast.h | 1 + doc/gmqcc.1 | 5 +++++ gmqcc.ini.example | 5 +++++ opts.c | 1 + opts.def | 1 + parser.c | 25 ++++++++++++++++++++++--- 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/ast.h b/ast.h index bf7f6aa..049feb9 100644 --- a/ast.h +++ b/ast.h @@ -144,6 +144,7 @@ typedef struct #define AST_FLAG_NORETURN (1<<1) #define AST_FLAG_INLINE (1<<2) #define AST_FLAG_INITIALIZED (1<<3) +#define AST_FLAG_DEPRECATED (1<<4) #define AST_FLAG_TYPE_MASK (AST_FLAG_VARIADIC | AST_FLAG_NORETURN) /* Value diff --git a/doc/gmqcc.1 b/doc/gmqcc.1 index 5b54510..581a8e9 100644 --- a/doc/gmqcc.1 +++ b/doc/gmqcc.1 @@ -278,6 +278,11 @@ marked \'const\'. .TP .B -Wdifferent-attributes Similar to the above but for attributes like "[[noreturn]]". +.TP +.B -Wdeprecated +Warn when a function is marked with the attribute +"[[deprecated]]". This flag enables a warning on calls to functions +marked as such. .SH COMPILE FLAGS .TP .B -fdarkplaces-string-table-bug diff --git a/gmqcc.ini.example b/gmqcc.ini.example index e2956dc..6d7a53f 100644 --- a/gmqcc.ini.example +++ b/gmqcc.ini.example @@ -205,6 +205,11 @@ # [[noreturn]] DIFFERENT_ATTRIBUTES = true + # Warn when a function is marked with the attribute + # "[[deprecated]]". This flag enables a warning on calls to functions + # marked as such. + DEPRECATED = true + # Finally these are all the optimizations, usually present via the -O # prefix from the command line. [optimizations] diff --git a/opts.c b/opts.c index 69cb899..35f7114 100644 --- a/opts.c +++ b/opts.c @@ -57,6 +57,7 @@ static void opts_setdefault() { opts_set(opts.warn, WARN_RESERVED_NAMES, true); opts_set(opts.warn, WARN_UNINITIALIZED_CONSTANT, true); opts_set(opts.warn, WARN_UNINITIALIZED_GLOBAL, false); + opts_set(opts.warn, WARN_DEPRECATED, true); /* flags */ opts_set(opts.flags, ADJUST_VECTOR_FIELDS, true); opts_set(opts.flags, FTEPP, false); diff --git a/opts.def b/opts.def index eb76082..25b2722 100644 --- a/opts.def +++ b/opts.def @@ -84,6 +84,7 @@ GMQCC_DEFINE_FLAG(UNINITIALIZED_GLOBAL) GMQCC_DEFINE_FLAG(DIFFERENT_QUALIFIERS) GMQCC_DEFINE_FLAG(DIFFERENT_ATTRIBUTES) + GMQCC_DEFINE_FLAG(DEPRECATED) #endif #ifdef GMQCC_TYPE_OPTIMIZATIONS diff --git a/parser.c b/parser.c index 53220b5..a191c53 100644 --- a/parser.c +++ b/parser.c @@ -1373,18 +1373,29 @@ static bool parser_close_call(parser_t *parser, shunt *sy) return false; } + if (!fun->expression.next) { parseerror(parser, "could not determine function return type"); return false; } else { + ast_value *fval = (ast_istype(fun, ast_value) ? ((ast_value*)fun) : NULL); + + if (fun->expression.flags & AST_FLAG_DEPRECATED) { + if (!fval) + return !parsewarning(parser, WARN_DEPRECATED, "call to function (which is marked deprecated)\n" + "-> it has been declared here: %s:%i", + ast_ctx(fun).file, ast_ctx(fun).line); + else + return !parsewarning(parser, WARN_DEPRECATED, "call to `%s` (which is marked deprecated)\n" + "-> `%s` declared here: %s:%i", + fval->name, fval->name, ast_ctx(fun).file, ast_ctx(fun).line); + } + if (vec_size(fun->expression.params) != paramcount && !((fun->expression.flags & AST_FLAG_VARIADIC) && vec_size(fun->expression.params) < paramcount)) { - ast_value *fval; const char *fewmany = (vec_size(fun->expression.params) > paramcount) ? "few" : "many"; - - fval = (ast_istype(fun, ast_value) ? ((ast_value*)fun) : NULL); if (opts.standard == COMPILER_GMQCC) { if (fval) @@ -2606,6 +2617,14 @@ static bool parse_qualifiers(parser_t *parser, bool with_local, int *cvq, bool * return false; } } + else if (!strcmp(parser_tokval(parser), "deprecated")) { + flags |= AST_FLAG_DEPRECATED; + if (!parser_next(parser) || parser->tok != TOKEN_ATTRIBUTE_CLOSE) { + parseerror(parser, "`deprecated` attribute has no parameters, expected `]]`"); + *cvq = CV_WRONG; + return false; + } + } else { /* Skip tokens until we hit a ]] */ -- 2.39.2