Bug 10646 - [3.3/3.4 regression] non-const reference is incorrectly matched in a "const T" partial specialization
|
Bug#:
10646
|
Product: gcc
|
Version: 3.2
|
|
Host:
|
Target:
|
Build:
|
|
Status: RESOLVED
|
Severity: normal
|
Priority: P3
|
|
Resolution: FIXED
|
Assigned To: unassigned@gcc.gnu.org
|
Reported By: notbob@tessellation.com
|
|
Component: c++
|
Target Milestone: 3.4.1
|
|
Summary: [3.3/3.4 regression] non-const reference is incorrectly matched in a "const T" partial specialization
|
|
Keywords: rejects-valid
|
|
Opened: 2003-05-06 22:46
|
|
Description:
|
Last confirmed: 2003-07-05 23:24
|
Opened: 2003-05-06 22:46
|
I apologize in advance if I'm not reporting this "bug"
absolutely correctly. I haven't done this before. I
appreciate your patience. Thank you.
I believe my template should report references and functions as NOT const.
Is this "pilot error" or a compiler bug?
Release:
gcc version 3.2 20020927 (prerelease)
Environment:
in bash via cygwin on windows 98 se
How-To-Repeat:
g++ is_const.cpp
./a.exe
Fix:
As a fix, you can add another specialization that matches
references and set the result to false. Alternatively,
use boost::is_const that works correctly (has workarounds).
State-Changed-From-To: open->analyzed
State-Changed-Why: The bug for function types is confirmed in 3.2 but it's
fixed in 3.3 (20030503) and 3.4 (20030503). It might be
fixed in 3.2.3 as well, I don't have that version.
There still is a bug with references, though:
---------------------------------
template <typename T>
struct is_const
{
typedef int type;
};
template <typename T>
struct is_const<const T>
{};
is_const<bool&>::type a;
---------------------------------
This should compile (but I'm not 100% sure because this
very part of the standard is still a bit misterious for me),
and it does on MSVC71 and Comeau/EDG, but fails with GCC
3.3 and 3.4. Since it worked in 2.95, I rate this as a
regression.
The regression in 10646 was introduced or exposed by this patch:
--- gcc/gcc/cp/ChangeLog ---
> 2002-02-22 Nathan Sidwell <nathan@codesourcery.com>
>
> PR c++/2645, DR 295
> * cp-tree.h (tsubst_flags_t): Add tf_ignore_bad_quals,
> tf_keep_type_decl.
> (make_typename_type): Use tsubst_flags_t.
> * decl.c (make_typename_type): Adjust. Return non-artificial
> TYPE_DECLs, if required.
> (grokdeclarator): Simplify CVR qualification handling. Allow bad
> qualifiers on typedef types.
> * decl2.c (handle_class_head): Adjust make_typename_type call.
> * parse.y (nested_name_specifier): Likewise.
> (typename_sub0): Likewise.
> (typename_sub1): Likewise.
> * pt.c (convert_template_argument): Adjust make_typename_type
> return value.
> (tsubst): Adjust cp_build_qualified_type_real calls.
> (check_cv_quals_for_unify): Cope with alowing bad qualifications
> on template type parms.
> (instantiate_decl): Recheck substitutions to give warnings on bad
> qualifications.
> * tree.c (cp_build_qualified_type_real): Use tf_allow_bad_quals.
The regression hunt used the smaller test case from comment #2.
Not a bug.
CV qualifiers are ignored on reference type when introduced via a typedef
or template type parameter.
Nathan, this now compiles on the mainline, this is correct right?