diff options
author | Nathan Froyd <froydnj@codesourcery.com> | 2010-11-24 23:29:41 +0000 |
---|---|---|
committer | Nathan Froyd <froydnj@gcc.gnu.org> | 2010-11-24 23:29:41 +0000 |
commit | a3abe41c30c8f779e203452a0b31a33b825565c7 (patch) | |
tree | f82e67116455c990ac9fdc580e1af29b8e486995 | |
parent | fb9041eab317593ef2d1b38b2258d17e5e17bb6c (diff) | |
download | gcc-a3abe41c30c8f779e203452a0b31a33b825565c7.zip gcc-a3abe41c30c8f779e203452a0b31a33b825565c7.tar.gz gcc-a3abe41c30c8f779e203452a0b31a33b825565c7.tar.bz2 |
cppbuiltin.c (define_builtin_macros_for_type_sizes): Define __FLOAT_WORD_ORDER__ according to FLOAT_WORDS_BIG_ENDIAN.
gcc/
* cppbuiltin.c (define_builtin_macros_for_type_sizes): Define
__FLOAT_WORD_ORDER__ according to FLOAT_WORDS_BIG_ENDIAN.
* config/dfp-bit.h (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Delete.
* doc/cpp.texi (__FLOAT_WORD_ORDER__): Document.
* system.h (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Poison.
libgcc/
* config/libbid/bid_conf.h (BID_BIG_ENDIAN): Define in terms of
__FLOAT_WORD_ORDER__.
* config/libbid/bid_gcc_intrinsics.h (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN):
Delete.
libdecnumber/
* dconfig.h (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Delete.
(WORDS_BIG_ENDIAN): Define based on value of __FLOAT_WORD_ORDER__.
From-SVN: r167129
28 files changed, 133 insertions, 31 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ec3b96f..85ff5a9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-11-24 Nathan Froyd <froydnj@codesourcery.com> + + * cppbuiltin.c (define_builtin_macros_for_type_sizes): Define + __FLOAT_WORD_ORDER__ according to FLOAT_WORDS_BIG_ENDIAN. + * config/dfp-bit.h (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Delete. + * doc/cpp.texi (__FLOAT_WORD_ORDER__): Document. + * system.h (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Poison. + 2010-11-24 H.J. Lu <hongjiu.lu@intel.com> PR target/46519 diff --git a/gcc/config/dfp-bit.h b/gcc/config/dfp-bit.h index 20688b1..c1ee377 100644 --- a/gcc/config/dfp-bit.h +++ b/gcc/config/dfp-bit.h @@ -33,11 +33,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "coretypes.h" #include "tm.h" -#ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN -#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN \ - (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__) -#endif - #ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE #endif diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 67f4f93..a323501 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5639,6 +5639,9 @@ extern tree cxx_omp_clause_dtor (tree, tree); extern void cxx_omp_finish_clause (tree); extern bool cxx_omp_privatize_by_reference (const_tree); +/* in name-lookup.c */ +extern void suggest_alternatives_for (tree); + /* -- end of C++ */ #endif /* ! GCC_CP_TREE_H */ diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 1560fc6..de45efe 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -1700,6 +1700,7 @@ dump_expr (tree t, int flags) case NAMESPACE_DECL: case LABEL_DECL: case OVERLOAD: + case TYPE_DECL: case IDENTIFIER_NODE: dump_decl (t, (flags & ~TFF_DECL_SPECIFIERS) | TFF_NO_FUNCTION_ARGUMENTS); break; diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c index c583d7d..9c6be41 100644 --- a/gcc/cp/lex.c +++ b/gcc/cp/lex.c @@ -450,7 +450,10 @@ unqualified_name_lookup_error (tree name) else { if (!objc_diagnose_private_ivar (name)) - error ("%qD was not declared in this scope", name); + { + error ("%qD was not declared in this scope", name); + suggest_alternatives_for (name); + } /* Prevent repeated error messages by creating a VAR_DECL with this NAME in the innermost block scope. */ if (current_function_decl) diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index dc73544..0ee80e4 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -30,8 +30,10 @@ along with GCC; see the file COPYING3. If not see #include "timevar.h" #include "toplev.h" #include "diagnostic-core.h" +#include "intl.h" #include "debug.h" #include "c-family/c-pragma.h" +#include "params.h" /* The bindings for a particular name in a particular scope. */ @@ -3917,6 +3919,73 @@ remove_hidden_names (tree fns) return fns; } +/* Suggest alternatives for NAME, an IDENTIFIER_NODE for which name + lookup failed. Search through all available namespaces and print out + possible candidates. */ + +void +suggest_alternatives_for (tree name) +{ + VEC(tree,heap) *candidates = NULL; + VEC(tree,heap) *namespaces_to_search = NULL; + int max_to_search = PARAM_VALUE (CXX_MAX_NAMESPACES_FOR_DIAGNOSTIC_HELP); + int n_searched = 0; + char *spaces; + const char *str; + tree t; + unsigned ix; + + VEC_safe_push (tree, heap, namespaces_to_search, global_namespace); + + while (!VEC_empty (tree, namespaces_to_search) + && n_searched < max_to_search) + { + tree scope = VEC_pop (tree, namespaces_to_search); + struct scope_binding binding = EMPTY_SCOPE_BINDING; + struct cp_binding_level *level = NAMESPACE_LEVEL (scope); + + /* Look in this namespace. */ + qualified_lookup_using_namespace (name, scope, &binding, 0); + + n_searched++; + + if (binding.value) + VEC_safe_push (tree, heap, candidates, binding.value); + + /* Add child namespaces. */ + for (t = level->namespaces; t; t = DECL_CHAIN (t)) + VEC_safe_push (tree, heap, namespaces_to_search, t); + } + + /* If we stopped before we could examine all namespaces, inform the + user. Do this even if we don't have any candidates, since there + might be more candidates further down that we weren't able to + find. */ + if (n_searched >= max_to_search) + inform (input_location, + "maximum limit of %d namespaces searched for %qE", + max_to_search, name); + + /* Nothing useful to report. */ + if (VEC_empty (tree, candidates)) + return; + + str = (VEC_length(tree, candidates) > 1 + ? _("suggested alternatives:") + : _("suggested alternative:")); + spaces = NULL; + + FOR_EACH_VEC_ELT (tree, candidates, ix, t) + { + inform (input_location, "%s %qE", (spaces ? spaces : str), t); + spaces = spaces ? spaces : get_spaces (str); + } + + VEC_free (tree, heap, candidates); + VEC_free (tree, heap, namespaces_to_search); + free (spaces); +} + /* Unscoped lookup of a global: iterate over current namespaces, considering using-directives. */ diff --git a/gcc/cppbuiltin.c b/gcc/cppbuiltin.c index ffee4c0..ee00de5 100644 --- a/gcc/cppbuiltin.c +++ b/gcc/cppbuiltin.c @@ -157,6 +157,11 @@ define_builtin_macros_for_type_sizes (cpp_reader *pfile) cpp_define (pfile, "__BYTE_ORDER__=__ORDER_PDP_ENDIAN__"); } + cpp_define_formatted (pfile, "__FLOAT_WORD_ORDER__=%s", + (FLOAT_WORDS_BIG_ENDIAN + ? "__ORDER_BIG_ENDIAN__" + : "__ORDER_LITTLE_ENDIAN__")); + /* ptr_type_node can't be used here since ptr_mode is only set when toplev calls backend_init which is not done with -E switch. */ cpp_define_formatted (pfile, "__SIZEOF_POINTER__=%d", diff --git a/gcc/doc/cpp.texi b/gcc/doc/cpp.texi index ddcf814..7d78d12 100644 --- a/gcc/doc/cpp.texi +++ b/gcc/doc/cpp.texi @@ -2289,6 +2289,11 @@ You should use these macros for testing like this: #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ @end smallexample +@item __FLOAT_WORD_ORDER__ +@code{__FLOAT_WORD_ORDER__} is defined to one of the values +@code{__ORDER_LITTLE_ENDIAN__} or @code{__ORDER_BIG_ENDIAN__} to reflect +the layout of the words of multi-word floating-point quantities. + @item __DEPRECATED This macro is defined, with value 1, when compiling a C++ source file with warnings about deprecated constructs enabled. These warnings are diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index 3db5ac1..fcb66ce 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -1932,7 +1932,6 @@ lto_fixup_tree (tree *tp, int *walk_subtrees, void *data) { /* walk_tree only handles TREE_OPERANDs. Do the rest here. */ lto_fixup_common (t, data); - LTO_FIXUP_SUBTREE (t->exp.block); *walk_subtrees = 1; } else diff --git a/gcc/params.def b/gcc/params.def index 6b6e0550..2ea0013 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -855,6 +855,15 @@ DEFPARAM (MIN_PARTITION_SIZE, "lto-min-partition", "Size of minimal paritition for WHOPR (in estimated instructions)", 1000, 0, 0) + +/* Diagnostic parameters. */ + +DEFPARAM (CXX_MAX_NAMESPACES_FOR_DIAGNOSTIC_HELP, + "cxx-max-namespaces-for-diagnostic-help", + "Maximum number of namespaces to search for alternatives when " + "name lookup fails", + 1000, 0, 0) + /* Local variables: mode:c diff --git a/gcc/reload1.c b/gcc/reload1.c index da354a7..2f02ae3 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -6600,17 +6600,6 @@ choose_reload_regs (struct insn_chain *chain) && (rld[r].nregs == max_group_size || ! reg_classes_intersect_p (rld[r].rclass, group_class))) search_equiv = rld[r].in; - /* If this is an output reload from a simple move insn, look - if an equivalence for the input is available. */ - else if (inheritance && rld[r].in == 0 && rld[r].out != 0) - { - rtx set = single_set (insn); - - if (set - && rtx_equal_p (rld[r].out, SET_DEST (set)) - && CONSTANT_P (SET_SRC (set))) - search_equiv = SET_SRC (set); - } if (search_equiv) { diff --git a/gcc/system.h b/gcc/system.h index 4de117e..fbeab0f 100644 --- a/gcc/system.h +++ b/gcc/system.h @@ -800,7 +800,8 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; TARGET_HANDLE_OFAST TARGET_OPTION_OPTIMIZATION /* Hooks into libgcc2. */ - #pragma GCC poison LIBGCC2_DOUBLE_TYPE_SIZE LIBGCC2_WORDS_BIG_ENDIAN + #pragma GCC poison LIBGCC2_DOUBLE_TYPE_SIZE LIBGCC2_WORDS_BIG_ENDIAN \ + LIBGCC2_FLOAT_WORDS_BIG_ENDIAN /* Miscellaneous macros that are no longer used. */ #pragma GCC poison USE_MAPPED_LOCATION diff --git a/gcc/testsuite/g++.dg/ext/builtin3.C b/gcc/testsuite/g++.dg/ext/builtin3.C index 3d06dd7..a9ebce0 100644 --- a/gcc/testsuite/g++.dg/ext/builtin3.C +++ b/gcc/testsuite/g++.dg/ext/builtin3.C @@ -10,4 +10,5 @@ extern "C" int printf(char*, ...); void foo() { printf("abc"); // { dg-error "not declared" } + // { dg-message "note" "suggested alternative" { target *-*-* } 12 } } diff --git a/gcc/testsuite/g++.dg/lookup/error1.C b/gcc/testsuite/g++.dg/lookup/error1.C index 2264b23..3b34ee3 100644 --- a/gcc/testsuite/g++.dg/lookup/error1.C +++ b/gcc/testsuite/g++.dg/lookup/error1.C @@ -4,6 +4,7 @@ namespace N { int i; } void foo() { i; } // { dg-error "not declared" } + // { dg-message "note" "suggested alternative" { target *-*-* } 6 } using namespace N; void bar() { i; } diff --git a/gcc/testsuite/g++.dg/lookup/koenig5.C b/gcc/testsuite/g++.dg/lookup/koenig5.C index 6ecc25d..bc1dc8c 100644 --- a/gcc/testsuite/g++.dg/lookup/koenig5.C +++ b/gcc/testsuite/g++.dg/lookup/koenig5.C @@ -32,10 +32,12 @@ void g (N::A *a, M::B *b, O::C *c) One (a); // ok One (a, b); // ok One (b); // { dg-error "not declared" } + // { dg-message "note" "suggested alternative" { target *-*-* } 34 } Two (c); // ok Two (a, c); // ok Two (a); // { dg-error "not declared" } + // { dg-message "note" "suggested alternative" { target *-*-* } 39 } Two (a, a); // error masked by earlier error Two (b); // error masked by earlier error Two (a, b); // error masked by earlier error @@ -43,4 +45,5 @@ void g (N::A *a, M::B *b, O::C *c) Three (b); // ok Three (a, b); // ok Three (a); // { dg-error "not declared" } + // { dg-message "note" "suggested alternative" { target *-*-* } 47 } } diff --git a/gcc/testsuite/g++.dg/overload/koenig1.C b/gcc/testsuite/g++.dg/overload/koenig1.C index 1ed7bce..be0be69 100644 --- a/gcc/testsuite/g++.dg/overload/koenig1.C +++ b/gcc/testsuite/g++.dg/overload/koenig1.C @@ -14,5 +14,6 @@ void g () B *bp; N::A *ap; f (bp); // { dg-error "not declared" } + // { dg-message "note" "suggested alternative" { target *-*-* } 16 } f (ap); } diff --git a/gcc/testsuite/g++.dg/parse/decl-specifier-1.C b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C index e81fbab..48fc7fa 100644 --- a/gcc/testsuite/g++.dg/parse/decl-specifier-1.C +++ b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C @@ -13,4 +13,5 @@ N::X X; // { dg-error "" "" } int main() { return sizeof(X); // { dg-error "" "" } + // { dg-message "note" "suggested alternative" { target *-*-* } 15 } } diff --git a/gcc/testsuite/g++.dg/template/static10.C b/gcc/testsuite/g++.dg/template/static10.C index ab857bd..2f60f0c 100644 --- a/gcc/testsuite/g++.dg/template/static10.C +++ b/gcc/testsuite/g++.dg/template/static10.C @@ -20,4 +20,5 @@ namespace std { template<> void vector<int, allocator<int> >::swap(vector<int, allocator<int> >&) { } // { dg-error "" } + // { dg-message "note" "suggested alternative" { target *-*-* } 22 } } diff --git a/gcc/testsuite/g++.old-deja/g++.mike/ns5.C b/gcc/testsuite/g++.old-deja/g++.mike/ns5.C index 9d806ca..f13da04 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/ns5.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/ns5.C @@ -4,3 +4,4 @@ namespace A { } int j = i; // { dg-error "" } + // { dg-message "note" "suggested alternative" { target *-*-* } 6 } diff --git a/gcc/testsuite/g++.old-deja/g++.mike/ns7.C b/gcc/testsuite/g++.old-deja/g++.mike/ns7.C index 57008db..31a71dd 100644 --- a/gcc/testsuite/g++.old-deja/g++.mike/ns7.C +++ b/gcc/testsuite/g++.old-deja/g++.mike/ns7.C @@ -6,4 +6,5 @@ namespace A { namespace B { int j = i; // { dg-error "" } + // { dg-message "note" "suggested alternative" { target *-*-* } 8 } } diff --git a/gcc/testsuite/g++.old-deja/g++.ns/koenig5.C b/gcc/testsuite/g++.old-deja/g++.ns/koenig5.C index 33061ad..67b781d 100644 --- a/gcc/testsuite/g++.old-deja/g++.ns/koenig5.C +++ b/gcc/testsuite/g++.old-deja/g++.ns/koenig5.C @@ -15,4 +15,5 @@ void g() // foo variable first, and therefore do not // perform argument-dependent lookup. bar(new X); // { dg-error "not declared" } + // { dg-message "note" "suggested alternative" { target *-*-* } 17 } } diff --git a/gcc/testsuite/g++.old-deja/g++.ns/koenig9.C b/gcc/testsuite/g++.old-deja/g++.ns/koenig9.C index 78b0e8b..f246639 100644 --- a/gcc/testsuite/g++.old-deja/g++.ns/koenig9.C +++ b/gcc/testsuite/g++.old-deja/g++.ns/koenig9.C @@ -10,4 +10,5 @@ void foo(const char*,...); inline void bar() { foo("",count); // { dg-error "" } multiple overloaded count functions + // { dg-message "note" "suggested alternative" { target *-*-* } 12 } } diff --git a/gcc/testsuite/g++.old-deja/g++.other/lineno5.C b/gcc/testsuite/g++.old-deja/g++.other/lineno5.C index d14bd90..20e49bc 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/lineno5.C +++ b/gcc/testsuite/g++.old-deja/g++.other/lineno5.C @@ -16,4 +16,5 @@ namespace tmp { class A { public: int kaka(tmp::B = b); // { dg-error "" } no b in scope + // { dg-message "note" "suggested alternative" { target *-*-* } 18 } }; diff --git a/libdecnumber/ChangeLog b/libdecnumber/ChangeLog index d2d6d59..101cda9 100644 --- a/libdecnumber/ChangeLog +++ b/libdecnumber/ChangeLog @@ -1,3 +1,8 @@ +2010-11-24 Nathan Froyd <froydnj@codesourcery.com> + + * dconfig.h (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Delete. + (WORDS_BIG_ENDIAN): Define based on value of __FLOAT_WORD_ORDER__. + 2010-10-23 Nathan Froyd <froydnj@codesourcery.com> * dconfig.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. diff --git a/libdecnumber/dconfig.h b/libdecnumber/dconfig.h index 26b963c..503cb61 100644 --- a/libdecnumber/dconfig.h +++ b/libdecnumber/dconfig.h @@ -28,12 +28,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "coretypes.h" #include "tm.h" -#ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN -#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN \ - (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__) -#endif - -#if LIBGCC2_FLOAT_WORDS_BIG_ENDIAN +#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__ #define WORDS_BIGENDIAN 1 #endif diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 0f18b56..0e31d98 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,10 @@ +2010-11-24 Nathan Froyd <froydnj@codesourcery.com> + + * config/libbid/bid_conf.h (BID_BIG_ENDIAN): Define in terms of + __FLOAT_WORD_ORDER__. + * config/libbid/bid_gcc_intrinsics.h (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): + Delete. + 2010-11-20 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> PR other/46202 diff --git a/libgcc/config/libbid/bid_conf.h b/libgcc/config/libbid/bid_conf.h index d22980d..93e60ed 100644 --- a/libgcc/config/libbid/bid_conf.h +++ b/libgcc/config/libbid/bid_conf.h @@ -516,7 +516,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #endif #ifndef BID_BIG_ENDIAN -#define BID_BIG_ENDIAN LIBGCC2_FLOAT_WORDS_BIG_ENDIAN +#define BID_BIG_ENDIAN __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__ #endif #ifndef BID_THREAD diff --git a/libgcc/config/libbid/bid_gcc_intrinsics.h b/libgcc/config/libbid/bid_gcc_intrinsics.h index f536e3b..7d65705 100644 --- a/libgcc/config/libbid/bid_gcc_intrinsics.h +++ b/libgcc/config/libbid/bid_gcc_intrinsics.h @@ -30,11 +30,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "coretypes.h" #include "tm.h" -#ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN -#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN \ - (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__) -#endif - #ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE #endif |