re PR debug/79000 (ICE: in gen_member_die, at dwarf2out.c:23995)

2017-01-09  Richard Biener  <rguenther@suse.de>

	PR debug/79000
	* dwarf2out.c (is_cxx): New overload with context.
	(is_naming_typedef_decl): Use it.

	* g++.dg/lto/pr79000_0.C: New testcase.
	* g++.dg/lto/pr79000_1.c: Likewise.

From-SVN: r244217
This commit is contained in:
Richard Biener 2017-01-09 08:22:58 +00:00 committed by Richard Biener
parent d86c3c0226
commit 813b9c0d3a
5 changed files with 47 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2017-01-09 Richard Biener <rguenther@suse.de>
PR debug/79000
* dwarf2out.c (is_cxx): New overload with context.
(is_naming_typedef_decl): Use it.
2017-01-08 Sandra Loosemore <sandra@codesourcery.com>
* invoke.texi (Option Summary): Correct spacing in option lists

View File

@ -3356,6 +3356,7 @@ static int get_AT_flag (dw_die_ref, enum dwarf_attribute);
static unsigned get_AT_unsigned (dw_die_ref, enum dwarf_attribute);
static inline dw_die_ref get_AT_ref (dw_die_ref, enum dwarf_attribute);
static bool is_cxx (void);
static bool is_cxx (const_tree);
static bool is_fortran (void);
static bool is_ada (void);
static bool remove_AT (dw_die_ref, enum dwarf_attribute);
@ -4990,6 +4991,27 @@ is_cxx (void)
|| lang == DW_LANG_C_plus_plus_11 || lang == DW_LANG_C_plus_plus_14);
}
/* Return TRUE if DECL was created by the C++ frontend. */
static bool
is_cxx (const_tree decl)
{
if (in_lto_p)
{
const_tree context = decl;
while (context && TREE_CODE (context) != TRANSLATION_UNIT_DECL)
{
if (TREE_CODE (context) == BLOCK)
context = BLOCK_SUPERCONTEXT (context);
else
context = get_containing_scope (context);
}
if (context && TRANSLATION_UNIT_LANGUAGE (context))
return strncmp (TRANSLATION_UNIT_LANGUAGE (context), "GNU C++", 7) == 0;
}
return is_cxx ();
}
/* Return TRUE if the language is Java. */
static inline bool
@ -24762,7 +24784,7 @@ is_naming_typedef_decl (const_tree decl)
/* It looks like Ada produces TYPE_DECLs that are very similar
to C++ naming typedefs but that have different
semantics. Let's be specific to c++ for now. */
|| !is_cxx ())
|| !is_cxx (decl))
return FALSE;
return (DECL_ORIGINAL_TYPE (decl) == NULL_TREE

View File

@ -1,3 +1,9 @@
2017-01-09 Richard Biener <rguenther@suse.de>
PR debug/79000
* g++.dg/lto/pr79000_0.C: New testcase.
* g++.dg/lto/pr79000_1.c: Likewise.
2017-01-08 Martin Sebor <msebor@redhat.com>
PR middle-end/77708

View File

@ -0,0 +1,7 @@
// { dg-lto-do link }
// { dg-lto-options { "-flto -g" } }
// { dg-extra-ld-options "-r -nostdlib" }
struct a {
a();
} b;

View File

@ -0,0 +1,5 @@
typedef struct a b;
typedef struct a { } b;
struct {
b c;
} d;