This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/54207] [4.7/4.8 Regression][C++0x] ICE in build_noexcept_spec when bool is #defined/typedef'd
- From: "jakub at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 04 Dec 2012 11:08:04 +0000
- Subject: [Bug c++/54207] [4.7/4.8 Regression][C++0x] ICE in build_noexcept_spec when bool is #defined/typedef'd
- Auto-submitted: auto-generated
- References: <bug-54207-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54207
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |ASSIGNED
AssignedTo|unassigned at gcc dot |jakub at gcc dot gnu.org
|gnu.org |
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-12-04 11:08:04 UTC ---
Created attachment 28874
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28874
gcc48-pr54207.patch
The testcase is invalid, you can't add typedefs with system reserved names
before including standard headers, nor redefine keywords to something else.
That said, in this patch is a testcase which IMHO is valid and still ICEs even
with current trunk.
The thing is that perform_implicit_conversion will not do anything if the type
is same_type_p, but different (B vs. bool in this testcase, _Bool vs. bool in
the original testcase). In both cases the other type is also a BOOLEAN_TYPE,
but distinct from the original one. Doing == boolean_true_node or ==
boolean_false_node comparison doesn't work in that case, they aren't pointer
equal (as they have distinct type), yet they operand_equal_p true. So, either
we use operand_equal_p as this patch does (the patch guards it with INTEGER_CST
check to avoid calling operand_equal_p unnecessarily, but that can be certainly
dropped and done unconditionally if Jason prefers that), or we could for
INTEGER_CSTs fold_convert them to boolean_type_node, then the pointer equality
comparison would work.