[PATCH] Avoid ICE on alias + section attributes on different redeclarations (PR c/90760)

Jakub Jelinek jakub@redhat.com
Tue Jun 11 07:23:00 GMT 2019


On the following testcase, we handle the case where both attributes
are on the same decl (as varpool_node::alias isn't set yet), by setting the
section even on the alias and then diagnosing if it is different from the
target's section (would succeed with bar having baz section attribute).
If the alias and section attributes are on different declarations of the
same function, we ICE, as set_section asserts this->alias is not set,
but during cp_finish_decl it is.  My understanding is the problem the assert
wants to avoid is when the varpool node is already analyzed, aliases are
created and copied from the target to the aliases, but before that we can do
what we do if all the attributes are on the same decl.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2019-06-11  Jakub Jelinek  <jakub@redhat.com>

	PR c/90760
	* symtab.c (symtab_node::set_section): Allow being called on aliases
	as long as they aren't analyzed yet.

	* gcc.dg/pr90760.c: New test.

--- gcc/symtab.c.jj	2019-06-11 09:12:36.366555191 +0200
+++ gcc/symtab.c	2019-06-11 09:13:16.208922538 +0200
@@ -1583,7 +1583,7 @@ symtab_node::set_section (symtab_node *n
 symtab_node::set_section (const char *section)
-  gcc_assert (!this->alias);
+  gcc_assert (!this->alias || !this->analyzed);
     (symtab_node::set_section, const_cast<char *>(section), true);
--- gcc/testsuite/gcc.dg/pr90760.c.jj	2019-06-11 09:17:19.819054263 +0200
+++ gcc/testsuite/gcc.dg/pr90760.c	2019-06-11 09:17:12.034177879 +0200
@@ -0,0 +1,8 @@
+/* PR c/90760 */
+/* { dg-do compile } */
+/* { dg-require-named-sections "" } */
+void bar (void) {}
+void foo (void) __attribute__ ((alias ("bar")));	/* { dg-error "section of alias 'foo' must match section of its target" } */
+void foo (void) __attribute__ ((section ("baz")));
+void qux (void) __attribute__ ((alias ("bar"), section ("baz")));	/* { dg-error "section of alias 'qux' must match section of its target" } */


More information about the Gcc-patches mailing list