mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-01-18 14:21:36 +00:00
Implement [[deprecated]] general attribute, will mark functions as deprecated. Making calls to functions marked as such will trigger a compiler warning. Enabled by default.
This commit is contained in:
parent
755ee5462f
commit
921877e8a4
6 changed files with 35 additions and 3 deletions
1
ast.h
1
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
1
opts.c
1
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);
|
||||
|
|
1
opts.def
1
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
|
||||
|
|
25
parser.c
25
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 ]] */
|
||||
|
|
Loading…
Reference in a new issue