diff options
author | Paolo Bonzini <bonzini@gcc.gnu.org> | 2009-12-15 00:20:03 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2009-12-15 00:20:03 +0000 |
commit | 6ba6f70d7fa8fa889576172a23c199a51abdd045 (patch) | |
tree | cfeb179f5b57de2147e03bd05038051732204246 /gcc/cp/pt.c | |
parent | 9ed796d78bd95091e6715200c029c812047f843c (diff) | |
download | gcc-6ba6f70d7fa8fa889576172a23c199a51abdd045.zip gcc-6ba6f70d7fa8fa889576172a23c199a51abdd045.tar.gz gcc-6ba6f70d7fa8fa889576172a23c199a51abdd045.tar.bz2 |
[multiple changes]
2009-12-15 Paolo Bonzini <bonzini@gnu.org>
Shujing Zhao <pearly.zhao@oracle.com>
* intl.c (get_spaces): New.
* intl.h (get_spaces): New.
cp:
2009-12-15 Paolo Bonzini <bonzini@gnu.org>
Shujing Zhao <pearly.zhao@oracle.com>
* Makefile.in (cp/pt.o): Depend on intl.h
* call.c (print_z_candidates): Make loop more compact,
choose head string depending on number of candidates,
extract creation of spaces string to intl.c.
* pt.c (print_overloaded_functions): Replace with...
(print_candidates_1): ... this rewrite.
(print_candidates): Rewrite to call print_candidates_1.
(most_specialized_class): Make loop more compact,
choose head string depending on number of candidates,
and size indents depending on translations.
testsuite:
2009-12-15 Shujing Zhao <pearly.zhao@oracle.com>
* g++.dg/other/error20.C: Adjust dg-message strings.
* g++.dg/other/error31.C: Likewise.
* g++.dg/rtti/typeid6.C: Likewise.
* g++.dg/ext/ms-1.C: Likewise.
* g++.dg/parse/error19.C: Likewise.
* g++.dg/parse/crash5.C: Likewise.
* g++.dg/cpp0x/explicit4.C: Likewise.
* g++.dg/template/ptrmem4.C: Likewise.
* g++.dg/template/crash37.C: Likewise.
* g++.dg/template/qualttp5.C: Likewise.
* g++.dg/template/local6.C: Likewise.
* g++.dg/template/instantiate5.C: Likewise.
* g++.old-deja/g++.brendan/overload1.C: Likewise.
* g++.old-deja/g++.brendan/cvt3.C: Likewise.
* g++.old-deja/g++.brendan/overload4.C: Likewise.
* g++.old-deja/g++.jason/conversion11.C: Likewise.
* g++.old-deja/g++.jason/scoping10.C: Likewise.
* g++.old-deja/g++.other/expr1.C: Likewise.
* g++.old-deja/g++.other/pmf3.C: Likewise.
* g++.old-deja/g++.other/crash24.C: Likewise.
* g++.old-deja/g++.niklas/t120.C: Likewise.
* g++.old-deja/g++.niklas/t121.C: Likewise.
* g++.old-deja/g++.law/operators9.C: Likewise.
* g++.old-deja/g++.law/arm9.C: Likewise.
* g++.old-deja/g++.law/enum4.C: Likewise.
* g++.old-deja/g++.law/arg11.C: Likewise.
* g++.old-deja/g++.benjamin/15800-1.C: Likewise.
* g++.old-deja/g++.mike/p2431.C: Likewise.
* g++.old-deja/g++.mike/p438.C: Likewise.
* g++.old-deja/g++.mike/p9068.C: Likewise.
* g++.old-deja/g++.mike/p11110.C: Likewise.
* g++.old-deja/g++.bugs/900330_02.C: Likewise.
From-SVN: r155245
Diffstat (limited to 'gcc/cp/pt.c')
-rw-r--r-- | gcc/cp/pt.c | 76 |
1 files changed, 53 insertions, 23 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 6f76d46..68e277e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see #include "tm.h" #include "obstack.h" #include "tree.h" +#include "intl.h" #include "pointer-set.h" #include "flags.h" #include "c-common.h" @@ -1646,19 +1647,52 @@ explicit_class_specialization_p (tree type) return !uses_template_parms (CLASSTYPE_TI_ARGS (type)); } -/* Print the list of overloaded FNS in an error message. */ +/* Print the list of functions at FNS, going through all the overloads + for each element of the list. Alternatively, FNS can not be a + TREE_LIST, in which case it will be printed together with all the + overloads. + + MORE and *STR should respectively be FALSE and NULL when the function + is called from the outside. They are used internally on recursive + calls. print_candidates manages the two parameters and leaves NULL + in *STR when it ends. */ static void -print_overloaded_functions (tree fns, const char **str) +print_candidates_1 (tree fns, bool more, const char **str) { - tree fn; + tree fn, fn2; + char *spaces = NULL; + for (fn = fns; fn; fn = OVL_NEXT (fn)) + if (TREE_CODE (fn) == TREE_LIST) + { + gcc_assert (!OVL_NEXT (fn) && !is_overloaded_fn (fn)); + for (fn2 = fn; fn2 != NULL_TREE; fn2 = TREE_CHAIN (fn2)) + print_candidates_1 (TREE_VALUE (fn2), + TREE_CHAIN (fn2) || more, str); + } + else + { + if (!*str) + { + /* Pick the prefix string. */ + if (!more && !OVL_NEXT (fns)) + { + error ("candidate is: %+#D", OVL_CURRENT (fn)); + continue; + } + + *str = _("candidates are:"); + spaces = get_spaces (*str); + } + error ("%s %+#D", *str, OVL_CURRENT (fn)); + *str = spaces ? spaces : *str; + } + + if (!more) { - if (TREE_CODE (fn) == TREE_LIST) - print_candidates (fn); - else - error ("%s %+#D", *str, OVL_CURRENT (fn)); - *str = " "; + free (spaces); + *str = NULL; } } @@ -1667,16 +1701,9 @@ print_overloaded_functions (tree fns, const char **str) void print_candidates (tree fns) { - const char *str = "candidates are:"; - - if (is_overloaded_fn (fns)) - print_overloaded_functions (fns, &str); - else - { - tree fn; - for (fn = fns; fn != NULL_TREE; fn = TREE_CHAIN (fn)) - print_overloaded_functions (TREE_VALUE (fn), &str); - } + const char *str = NULL; + print_candidates_1 (fns, false, &str); + gcc_assert (str == NULL); } /* Returns the template (one of the functions given by TEMPLATE_ID) @@ -15753,13 +15780,16 @@ most_specialized_class (tree type, tree tmpl) if (ambiguous_p) { - const char *str = "candidates are:"; + const char *str; + char *spaces = NULL; error ("ambiguous class template instantiation for %q#T", type); + str = TREE_CHAIN (list) ? _("candidates are:") : _("candidate is:"); for (t = list; t; t = TREE_CHAIN (t)) - { - error ("%s %+#T", str, TREE_TYPE (t)); - str = " "; - } + { + error ("%s %+#T", spaces ? spaces : str, TREE_TYPE (t)); + spaces = spaces ? spaces : get_spaces (str); + } + free (spaces); return error_mark_node; } |