+1999-01-20 Mark Mitchell <mark@markmitchell.com>
+
+ * 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 <jason@yorick.cygnus.com>
* decl2.c (finish_vtable_vardecl): Make vtables comdat here.
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. */
}
/* 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)
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 ");
}
}
+ /* Print the function name. */
if (cname)
{
dump_type (cname, 0);
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)
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
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;
{
/* 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);
--- /dev/null
+// 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;
+}
--- /dev/null
+// Build don't link:
+
+template<int i> int f (void)
+{
+ if (__extension__ ({ 1; }))
+ return 0;
+ return 1;
+}
+
+void g (void)
+{
+ f<1> ();
+}
--- /dev/null
+// Build don't link:
+// Special g++ Options:
+
+template <class ARRY>
+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
+};