Bug 26696 - [4.0/4.1/4.2 Regression] ICE with statement forming unused static member function reference
Summary: [4.0/4.1/4.2 Regression] ICE with statement forming unused static member func...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.0.3
: P2 normal
Target Milestone: 4.0.4
Assignee: Jason Merrill
URL:
Keywords: ice-on-valid-code, monitored
Depends on:
Blocks: 28996
  Show dependency treegraph
 
Reported: 2006-03-15 14:04 UTC by marco
Modified: 2006-09-09 10:47 UTC (History)
6 users (show)

See Also:
Host:
Target:
Build:
Known to work: 3.4.0 3.3.3 4.2.0
Known to fail: 4.0.3 4.1.0
Last reconfirmed: 2006-09-06 00:48:25


Attachments
fix (329 bytes, patch)
2006-06-30 01:08 UTC, Dinar Temirbulatov
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description marco 2006-03-15 14:04:42 UTC
Testcase is short enough: 

struct A
{
	static void f() {}
}; 

int main() 
{
	A a; 
	a.f; 	
}

Produces a segfault on the line where "a.f" occurs. It should instead issue the warning "statement is a reference, not call, to function A::f". gcc 4.1.0 (at least the experimental mingw cross compiler I'm using here) seems to be affected too.
Comment 1 Andrew Pinski 2006-03-15 14:16:40 UTC
Confirmed.
Comment 2 Andrew Pinski 2006-03-15 14:17:07 UTC
Here is the ICE when checking is enabled:
t.cc:9: internal compiler error: tree check: expected field_decl, have baselink in component_ref_field_offset, at expr.c:5757
Comment 3 Dinar Temirbulatov 2006-06-30 01:08:14 UTC
Created attachment 11782 [details]
fix

we need to check first operand for FIELD_DECL before gimpilfying COMPONENT_REF
Comment 4 Dinar Temirbulatov 2006-07-05 10:46:42 UTC
>fix
>
>we need to check first operand for FIELD_DECL before gimpilfying COMPONENT_REF
this is a wrong fix, it caused some regressions 
Comment 5 Dinar Temirbulatov 2006-07-05 18:26:15 UTC
> It should instead issue the warning "statement is a reference, not call, to function A::f"

gcc producing the warnig, if you using -Wall flag
Comment 6 Jason Merrill 2006-09-06 17:06:11 UTC
Subject: Bug 26696

Author: jason
Date: Wed Sep  6 17:06:00 2006
New Revision: 116724

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=116724
Log:
        PR c++/26696
        * cvt.c (convert_to_void): Replace a subexpression with no side
        effects with void_zero_node.
        * tree.c (is_overloaded_fn): Look through COMPONENT_REF.
        (get_first_fn): Ditto.
        * decl.c (grokdeclarator): No need to look through COMPONENT_REF.

Added:
    trunk/gcc/testsuite/g++.dg/warn/noeffect8.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/cvt.c
    trunk/gcc/cp/decl.c
    trunk/gcc/cp/tree.c
    trunk/gcc/testsuite/g++.dg/other/component1.C

Comment 7 Jason Merrill 2006-09-07 22:27:18 UTC
Subject: Bug 26696

Author: jason
Date: Thu Sep  7 22:27:01 2006
New Revision: 116763

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=116763
Log:
        PR c++/26195
        * decl.c (make_rtl_for_nonlocal_decl),
        (start_preparsed_function): Don't use lbasename on
        input_filename when calling get_fileinfo.
        * semantics.c (begin_class_definition): Likewise.
        * lex.c (cxx_make_type): Likewise.
        (handle_pragma_interface): Call get_fileinfo on input_filename,
        not on the parameter to the directive.

        PR c++/26696
        * cvt.c (convert_to_void): Replace a subexpression with no side
        effects with void_zero_node.
        * tree.c (is_overloaded_fn): Look through COMPONENT_REF.
        (get_first_fn): Ditto.
        * decl.c (grokdeclarator): No need to look through COMPONENT_REF.

        PR c++/26571
        * parser.c (cp_parser_diagnose_invalid_type_name): Handle the case
        where the name is a type used incorrectly.

        PR c++/26671
        * typeck.c (maybe_warn_about_returning_address_of_local): Look
        through COMPONENT_REF and ARRAY_REF.

        PR c++/26102
        * name-lookup.c (do_class_using_decl): Try to find the base even
        if bases_dependent_p.
        * pt.c (type_dependent_expression_p): A USING_DECL is dependent.

        PR c++/19809
        * pt.c (tsubst_friend_function): Set DECL_INITIAL before pushdecl.

Modified:
    branches/gcc-4_1-branch/gcc/cp/ChangeLog
    branches/gcc-4_1-branch/gcc/cp/cvt.c
    branches/gcc-4_1-branch/gcc/cp/decl.c
    branches/gcc-4_1-branch/gcc/cp/lex.c
    branches/gcc-4_1-branch/gcc/cp/name-lookup.c
    branches/gcc-4_1-branch/gcc/cp/parser.c
    branches/gcc-4_1-branch/gcc/cp/pt.c
    branches/gcc-4_1-branch/gcc/cp/semantics.c
    branches/gcc-4_1-branch/gcc/cp/tree.c
    branches/gcc-4_1-branch/gcc/cp/typeck.c

Comment 8 Jason Merrill 2006-09-07 22:38:23 UTC
Subject: Bug 26696

Author: jason
Date: Thu Sep  7 22:38:03 2006
New Revision: 116764

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=116764
Log:
        PR c++/26195
        * decl.c (make_rtl_for_nonlocal_decl),
        (start_preparsed_function): Don't use lbasename on
        input_filename when calling get_fileinfo.
        * semantics.c (begin_class_definition): Likewise.
        * lex.c (cxx_make_type): Likewise.
        (handle_pragma_interface): Call get_fileinfo on input_filename,
        not on the parameter to the directive.

        PR c++/26696
        * cvt.c (convert_to_void): Replace a subexpression with no side
        effects with void_zero_node.
        * tree.c (is_overloaded_fn): Look through COMPONENT_REF.
        (get_first_fn): Ditto.
        * decl.c (grokdeclarator): No need to look through COMPONENT_REF.

        PR c++/26571
        * parser.c (cp_parser_diagnose_invalid_type_name): Handle the case
        where the name is a type used incorrectly.

        PR c++/26671
        * typeck.c (maybe_warn_about_returning_address_of_local): Look
        through COMPONENT_REF and ARRAY_REF.

        PR c++/19809
        * pt.c (tsubst_friend_function): Set DECL_INITIAL before pushdecl.

Modified:
    branches/gcc-4_0-branch/gcc/cp/ChangeLog
    branches/gcc-4_0-branch/gcc/cp/cvt.c
    branches/gcc-4_0-branch/gcc/cp/decl.c
    branches/gcc-4_0-branch/gcc/cp/lex.c
    branches/gcc-4_0-branch/gcc/cp/parser.c
    branches/gcc-4_0-branch/gcc/cp/pt.c
    branches/gcc-4_0-branch/gcc/cp/semantics.c
    branches/gcc-4_0-branch/gcc/cp/tree.c
    branches/gcc-4_0-branch/gcc/cp/typeck.c

Comment 9 Jason Merrill 2006-09-07 23:05:33 UTC
Fixed
Comment 10 Volker Reichelt 2006-09-08 23:33:33 UTC
The fix is incomplete. The following testcase still fails:

==========================
struct A
{
  static void foo();
};

void bar()
{
  A().foo;
}
==========================
Comment 11 Andrew Pinski 2006-09-08 23:45:28 UTC
(In reply to comment #10)
> The fix is incomplete. The following testcase still fails:

Can you file a new bug report since the orginal testcase here was fixed, even though your testcase is very closely related it really should be filed seperately.
Comment 12 Volker Reichelt 2006-09-09 10:47:39 UTC
The problem from comment #10 is now tracked in PR 28996.