]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
guarding vararg code by -fvariadic-args
authorWolfgang Bumiller <blub@speed.at>
Sat, 12 Jan 2013 15:28:04 +0000 (16:28 +0100)
committerWolfgang Bumiller <blub@speed.at>
Sat, 12 Jan 2013 15:28:04 +0000 (16:28 +0100)
opts.def
parser.c

index 4f015b883a8f3cca9c6af3f4e342642bc2f7c331..65c2d9e912ee72ff0b7225ea448f6f7f26272c89 100644 (file)
--- a/opts.def
+++ b/opts.def
@@ -49,6 +49,7 @@
     GMQCC_DEFINE_FLAG(UNTYPED_NIL)
     GMQCC_DEFINE_FLAG(PERMISSIVE)
     GMQCC_DEFINE_FLAG(ENHANCED_DIAGNOSTICS)
+    GMQCC_DEFINE_FLAG(VARIADIC_ARGS)
 #endif
 
 /* warning flags */
index 4459d7b1bdc336ed4c01c7c6580527f77d302978..53c7867bff857f4db8c60223b6320a9d9a8ddb52 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -1713,6 +1713,10 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
         else if (parser->tok == TOKEN_DOTS)
         {
             ast_expression *va;
+            if (!OPTS_FLAG(VARIADIC_ARGS)) {
+                parseerror(parser, "cannot access varargs (try -fvariadic-args)");
+                goto onerr;
+            }
             if (wantop) {
                 parseerror(parser, "expected operator or end of statement");
                 goto onerr;
@@ -3776,7 +3780,7 @@ static bool parse_function_body(parser_t *parser, ast_value *var)
         return false;
     }
 
-    if (var->expression.flags & AST_FLAG_VARIADIC) {
+    if (!OPTS_FLAG(VARIADIC_ARGS) && var->expression.flags & AST_FLAG_VARIADIC) {
         if (parsewarning(parser, WARN_VARIADIC_FUNCTION,
                          "variadic function with implementation will not be able to access additional parameters"))
         {
@@ -4012,7 +4016,7 @@ static bool parse_function_body(parser_t *parser, ast_value *var)
         func->argc = argc;
     }
 
-    if (var->expression.flags & AST_FLAG_VARIADIC) {
+    if (OPTS_FLAG(VARIADIC_ARGS) && var->expression.flags & AST_FLAG_VARIADIC) {
         char name[1024];
         ast_value *varargs = ast_value_new(ast_ctx(var), "reserved:va_args", TYPE_ARRAY);
         varargs->expression.flags |= AST_FLAG_IS_VARARG;