This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC] Fix for PR58201
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: Paolo Carlini <paolo dot carlini at oracle dot com>, Richard Biener <rguenther at suse dot de>, Bernd Schmidt <bernds at codesourcery dot com>, gcc-patches at gcc dot gnu dot org, jason at redhat dot com
- Date: Sat, 7 Sep 2013 10:28:46 +0200
- Subject: Re: [RFC] Fix for PR58201
- Authentication-results: sourceware.org; auth=none
- References: <20130904160409 dot GF20687 at kam dot mff dot cuni dot cz> <52276493 dot 9070706 at codesourcery dot com> <20130904170918 dot GI20687 at kam dot mff dot cuni dot cz> <c1c2f51e-89b8-4632-a075-3f82464e973c at email dot android dot com> <20130905230516 dot GB14285 at kam dot mff dot cuni dot cz> <5229FC71 dot 2090709 at oracle dot com> <20130907080308 dot GA8074 at kam dot mff dot cuni dot cz>
> > >+ 2013-09-04 Jan Hubicka <jh@suse.cz>
> > >+
> > >+ PR middle-end/58201
> > >+ * cgraphunit.c (analyze_functions): Clear AUX fields
> > >+ after processing; initialize assembler name has.
> > >+
> > I checked and double checked and with this commit a C++ test regressed:
> >
> > FAIL: g++.dg/template/cond2.C -std=gnu++98 (test for warnings, line 9)
> > FAIL: g++.dg/template/cond2.C -std=gnu++11 (test for warnings, line 9)
> >
> > In practice we emit a message off by one line, line 10 instead of
> > the correct line 9. Is it possible that you are clearing too much,
> > so to speak?
>
> Amazing, this testcase was triggering an ICE and I had to disable initialization
> of assembler name hash when error arrived. That fixed the problem, but I did not
> notice it is still having wrong line info.
>
> Adding an alias into the unit will trigger wrong line info before my change, since
> assembler name hash is populated too.
>
> The error is output from DECL_ASSEMBLER_NAME hook that by itself is strange.
>
> #0 0x0000000001041490 in error(char const*, ...) ()
> #1 0x0000000000735039 in write_expression(tree_node*) () at ../../gcc/cp/mangle.c:3008
> #2 0x000000000073a70f in write_template_arg(tree_node*) () at ../../gcc/cp/mangle.c:3179
> #3 0x000000000073ae69 in write_template_args(tree_node*) () at ../../gcc/cp/mangle.c:2551
> #4 0x00000000007332a4 in write_name(tree_node*, int) () at ../../gcc/cp/mangle.c:821
> #5 0x000000000073700c in write_type(tree_node*) () at ../../gcc/cp/mangle.c:2522
> #6 0x0000000000737279 in write_type(tree_node*) () at ../../gcc/cp/mangle.c:2017
> #7 0x0000000000738a18 in write_method_parms(tree_node*, int, tree_node*) () at ../../gcc/cp/mangle.c:2509
> #8 0x0000000000738e2f in write_bare_function_type(tree_node*, int, tree_node*) () at ../../gcc/cp/mangle.c:2451
> #9 0x0000000000733b9e in write_mangled_name(tree_node*, bool) () at ../../gcc/cp/mangle.c:689
> #10 0x000000000073c5b6 in mangle_decl_string(tree_node*) () at ../../gcc/cp/mangle.c:3446
> #11 0x000000000073c7e9 in mangle_decl(tree_node*) () at ../../gcc/cp/mangle.c:3468
> #12 0x0000000000d1df01 in decl_assembler_name(tree_node*) () at ../../gcc/tree.c:546
> #13 0x000000000083b1f5 in insert_to_assembler_name_hash(symtab_node_def*, bool) ()
> #14 0x000000000083b352 in symtab_initialize_asm_name_hash() [clone .part.3] ()
In the tree prior my change:
jh@gcc10:~/trunk/build4/gcc$ ./xgcc -B ./ -O2 ../../gcc/testsuite/g++.dg/template/cond2.C
../../gcc/testsuite/g++.dg/template/cond2.C: In instantiation of 'int test(c<(X ? : Y)>&) [with int X = 0; int Y = 2]':
../../gcc/testsuite/g++.dg/template/cond2.C:9:17: required from here
../../gcc/testsuite/g++.dg/template/cond2.C:6:28: error: omitted middle operand to '?:' operand cannot be mangled
template<int X, int Y> int test(c<X ? : Y>&); // { dg-error "omitted" }
^
jh@gcc10:~/trunk/build4/gcc$ ./xgcc -B ./ -O2 ../../gcc/testsuite/g++.dg/template/cond2.C -flto
../../gcc/testsuite/g++.dg/template/cond2.C: In instantiation of 'int test(c<(X ? : Y)>&) [with int X = 0; int Y = 2]':
../../gcc/testsuite/g++.dg/template/cond2.C:6:28: required from here
../../gcc/testsuite/g++.dg/template/cond2.C:6:28: error: omitted middle operand to '?:' operand cannot be mangled
template<int X, int Y> int test(c<X ? : Y>&); // { dg-error "omitted" }
So it is just an accident that the line info is output sanely (if line 9 is
sane, I don't exactly know)
What I can think of is to hide the stale source location when it no longer have
defined meaning:
Index: cgraphunit.c
===================================================================
--- cgraphunit.c (revision 202352)
+++ cgraphunit.c (working copy)
@@ -913,6 +913,7 @@ analyze_functions (void)
bitmap_obstack_initialize (NULL);
cgraph_state = CGRAPH_STATE_CONSTRUCTION;
+ input_location = UNKNOWN_LOCATION;
/* Ugly, but the fixup can not happen at a time same body alias is created;
C++ FE is confused about the COMDAT groups being right. */
but of course this just leads to:
jh@gcc10:~/trunk/build7/gcc$ ./xgcc -B ./ -O2 ../../gcc/testsuite/g++.dg/template/cond2.C
../../gcc/testsuite/g++.dg/template/cond2.C: In instantiation of 'int test(c<(X ? : Y)>&) [with int X = 0; int Y = 2]':
:0:0: required from here
../../gcc/testsuite/g++.dg/template/cond2.C:6:28: error: omitted middle operand to '?:' operand cannot be mangled
template<int X, int Y> int test(c<X ? : Y>&); // { dg-error "omitted" }
So i think it is up to C++ FE to correctly set and restore location info if it
wants to have error output correctly. DECL_SOURCE_LOCATION of the decl being
mangled is 6 that leads to useless mesage:
jh@gcc10:~/trunk/build7/gcc$ ./xgcc -B ./ -O2 ../../gcc/testsuite/g++.dg/template/cond2.C
../../gcc/testsuite/g++.dg/template/cond2.C: In instantiation of 'int test(c<(X ? : Y)>&) [with int X = 0; int Y = 2]':
../../gcc/testsuite/g++.dg/template/cond2.C:6:28: required from here
../../gcc/testsuite/g++.dg/template/cond2.C:6:28: error: omitted middle operand to '?:' operand cannot be mangled
template<int X, int Y> int test(c<X ? : Y>&); // { dg-error "omitted" }
Honza