From 61cd552e3b7e3dab5036a4be1a2a2c28707e6acf Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 20 Jan 1999 13:11:59 +0000 Subject: [PATCH] error.c (dump_function_decl): Don't print the argument types for a function when the verbosity level is negative. * error.c (dump_function_decl): Don't print the argument types for a function when the verbosity level is negative. * call.c (build_over_call): Check format attributes at call-time. * pt.c (tsubst_copy): Fix comment. (unify): Don't allow unification with variable-sized arrays. * semantics.c (finish_stmt_expr): When processing a template make the BIND_EXPR long-lived. From-SVN: r24788 --- gcc/cp/ChangeLog | 13 +++++++++++++ gcc/cp/call.c | 4 ++++ gcc/cp/error.c | 17 +++++++++++------ gcc/cp/pt.c | 16 +++++++++++++++- gcc/cp/semantics.c | 4 ++-- gcc/testsuite/g++.old-deja/g++.other/printf1.C | 14 ++++++++++++++ gcc/testsuite/g++.old-deja/g++.pt/crash27.C | 13 +++++++++++++ gcc/testsuite/g++.old-deja/g++.pt/crash28.C | 14 ++++++++++++++ 8 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/printf1.C create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/crash27.C create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/crash28.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2b3a14f8c54..9b14cda2d53 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +1999-01-20 Mark Mitchell + + * error.c (dump_function_decl): Don't print the argument types for + a function when the verbosity level is negative. + + * call.c (build_over_call): Check format attributes at call-time. + + * pt.c (tsubst_copy): Fix comment. + (unify): Don't allow unification with variable-sized arrays. + + * semantics.c (finish_stmt_expr): When processing a template make + the BIND_EXPR long-lived. + 1999-01-19 Jason Merrill * decl2.c (finish_vtable_vardecl): Make vtables comdat here. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index dd1f33b7e66..356a57d76ae 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3364,6 +3364,10 @@ build_over_call (cand, args, flags) converted_args = nreverse (converted_args); + if (warn_format && (DECL_NAME (fn) || DECL_ASSEMBLER_NAME (fn))) + check_function_format (DECL_NAME (fn), DECL_ASSEMBLER_NAME (fn), + converted_args); + /* Avoid actually calling copy constructors and copy assignment operators, if possible. */ diff --git a/gcc/cp/error.c b/gcc/cp/error.c index d5e28779825..fd3f5f50e4c 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -958,8 +958,9 @@ dump_decl (t, v) } /* Pretty printing for announce_function. T is the declaration of the - function we are interested in seeing. V is non-zero if we should print - the type that this function returns. */ + function we are interested in seeing. If V is zero, we print the + argument types. If V is positive, we also print the return types. + If V is negative, we do not even print the argument types. */ static void dump_function_decl (t, v) @@ -985,9 +986,8 @@ dump_function_decl (t, v) else if (TREE_CODE (fntype) == METHOD_TYPE) cname = TREE_TYPE (TREE_VALUE (parmtypes)); - v = (v > 0); - - if (v) + /* Print the return type. */ + if (v > 0) { if (DECL_STATIC_FUNCTION_P (t)) OB_PUTS ("static "); @@ -1001,6 +1001,7 @@ dump_function_decl (t, v) } } + /* Print the function name. */ if (cname) { dump_type (cname, 0); @@ -1021,7 +1022,11 @@ dump_function_decl (t, v) parmtypes = TREE_CHAIN (parmtypes); dump_function_name (t); - + + /* If V is negative, we don't print the argument types. */ + if (v < 0) + return; + OB_PUTC ('('); if (parmtypes) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ad0acaec2a1..0a675359d02 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6329,7 +6329,7 @@ tsubst_copy (t, args, in_decl) if (code == BIND_EXPR && !processing_template_decl) { - /* This processing should really occur in tsubst_expr, + /* This processing should really occur in tsubst_expr, However, tsubst_expr does not recurse into expressions, since it assumes that there aren't any statements inside them. Instead, it simply calls @@ -7504,6 +7504,20 @@ unify (tparms, targs, parm, arg, strict, explicit_mask) return 0; else if (targ) return 1; + + /* Make sure that ARG is not a variable-sized array. (Note that + were talking about variable-sized arrays (like `int[n]'), + rather than arrays of unknown size (like `int[]').) We'll + get very confused by such a type since the bound of the array + will not be computable in an instantiation. Besides, such + types are not allowed in ISO C++, so we can do as we please + here. */ + if (TREE_CODE (arg) == ARRAY_TYPE + && !uses_template_parms (arg) + && (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (arg))) + != INTEGER_CST)) + return 1; + TREE_VEC_ELT (targs, idx) = arg; return 0; diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index e4d4371472d..fd6f3d0d490 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -809,8 +809,8 @@ finish_stmt_expr (rtl_expr, expr) { /* Make a BIND_EXPR for the BLOCK already made. */ if (processing_template_decl) - result = build (BIND_EXPR, NULL_TREE, - NULL_TREE, last_tree, expr); + result = build_min_nt (BIND_EXPR, NULL_TREE, last_tree, + NULL_TREE); else result = build (BIND_EXPR, TREE_TYPE (rtl_expr), NULL_TREE, rtl_expr, expr); diff --git a/gcc/testsuite/g++.old-deja/g++.other/printf1.C b/gcc/testsuite/g++.old-deja/g++.other/printf1.C new file mode 100644 index 00000000000..04c4d9f8de5 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/printf1.C @@ -0,0 +1,14 @@ +// Build don't link: +// Special g++ Options: -Wall + +struct a +{ + void x(char *f,...) __attribute__((format(printf,2,3))); +}; + +int main() +{ + a A; + A.x("%d"); // WARNING - too few arguments for format + return 0; +} diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash27.C b/gcc/testsuite/g++.old-deja/g++.pt/crash27.C new file mode 100644 index 00000000000..f52f1ba9e02 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash27.C @@ -0,0 +1,13 @@ +// Build don't link: + +template int f (void) +{ + if (__extension__ ({ 1; })) + return 0; + return 1; +} + +void g (void) +{ + f<1> (); +} diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash28.C b/gcc/testsuite/g++.old-deja/g++.pt/crash28.C new file mode 100644 index 00000000000..752c9706990 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash28.C @@ -0,0 +1,14 @@ +// Build don't link: +// Special g++ Options: + +template +inline unsigned int asize(ARRY &a) +{ + return sizeof(a) / sizeof(a[0]); +} + +int f(unsigned int n) { + int x[n]; + + asize(x); // ERROR - no matching function +}; -- 2.30.2