diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 599fab3304..6458c2afe6 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,16 @@ +2004-06-28 Zack Weinberg + + * cp-demangle.h: Declare cplus_demangle_operators, + cplus_demangle_builtin_types, cplus_demangle_mangled_name, and + cplus_demangle_type as static if IN_GLIBCPP_V3. + +2004-06-28 Ian Lance Taylor + + PR other/16240 + * cp-demangle.c (d_expr_primary): Check for a failure return from + cplus_demangle_type. + * testsuite/demangle-expected: Add test case. + 2004-05-31 Danny Smith * pex-win32.c (fix_argv): Expand comment. @@ -597,7 +610,7 @@ 2003-08-12 Nathanael Nerode - * cp-demangle.c: Clarify what package(s) this is part of. + * cp-demangle.c: Clarify what package(s) this is part of. 2003-07-05 Danny Smith diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index fe4b36712d..8608bc8250 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -2398,6 +2398,8 @@ d_expr_primary (di) const char *s; type = cplus_demangle_type (di); + if (type == NULL) + return NULL; /* If we have a type we know how to print, we aren't going to print the type name itself. */ diff --git a/libiberty/cp-demangle.h b/libiberty/cp-demangle.h index eea086862d..02e74ec873 100644 --- a/libiberty/cp-demangle.h +++ b/libiberty/cp-demangle.h @@ -131,19 +131,31 @@ struct d_info /* Functions and arrays in cp-demangle.c which are referenced by functions in cp-demint.c. */ +#ifdef IN_GLIBCPP_V3 +#define CP_STATIC_IF_GLIBCPP_V3 static +#else +#define CP_STATIC_IF_GLIBCPP_V3 extern +#endif -extern const struct demangle_operator_info cplus_demangle_operators[]; +CP_STATIC_IF_GLIBCPP_V3 +const struct demangle_operator_info cplus_demangle_operators[]; #define D_BUILTIN_TYPE_COUNT (26) -extern const struct demangle_builtin_type_info +CP_STATIC_IF_GLIBCPP_V3 +const struct demangle_builtin_type_info cplus_demangle_builtin_types[D_BUILTIN_TYPE_COUNT]; -extern struct demangle_component * +CP_STATIC_IF_GLIBCPP_V3 +struct demangle_component * cplus_demangle_mangled_name PARAMS ((struct d_info *, int)); -extern struct demangle_component * +CP_STATIC_IF_GLIBCPP_V3 +struct demangle_component * cplus_demangle_type PARAMS ((struct d_info *)); extern void cplus_demangle_init_info PARAMS ((const char *, int, size_t, struct d_info *)); + +/* cp-demangle.c needs to define this a little differently */ +#undef CP_STATIC_IF_GLIBCPP_V3 diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index 9a3f0b9da8..d38ce33c83 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -3699,6 +3699,11 @@ _Z3fooIPA3_iEvRKT_ void foo(int (* const&) [3]) foo # +# This used to crash the demangler--PR 16240 +--format=gnu-v3 --no-params +_ZN13PatternDriver23StringScalarDeleteValueC1ERKNS_25ConflateStringScalarValueERKNS_25AbstractStringScalarValueERKNS_12TemplateEnumINS_12pdcomplementELZNS_16complement_namesEELZNS_14COMPLEMENTENUMEEEE +_ZN13PatternDriver23StringScalarDeleteValueC1ERKNS_25ConflateStringScalarValueERKNS_25AbstractStringScalarValueERKNS_12TemplateEnumINS_12pdcomplementELZNS_16complement_namesEELZNS_14COMPLEMENTENUMEEEE +PatternDriver::StringScalarDeleteValue::StringScalarDeleteValue # Test GNU V3 constructor and destructor identification. # 0 means it is not a constructor/destructor. # Other integers correspond to enum gnu_v3_{c,d}tor_kinds in demangle.h.