Patchwork C++ PATCH for c++/49418 (lost cv-quals on template parameter type)

login
register
mail settings
Submitter H.J. Lu
Date June 24, 2011, 4:23 a.m.
Message ID <BANLkTinu-r2F=3FOj3oZkW4CN6UzA7Zo+Q@mail.gmail.com>
Download mbox | patch
Permalink /patch/101717/
State New
Headers show

Comments

H.J. Lu - June 24, 2011, 4:23 a.m.
On Thu, Jun 23, 2011 at 8:07 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Thu, Jun 23, 2011 at 7:18 PM, Jason Merrill <jason@redhat.com> wrote:
>> On 06/23/2011 08:45 PM, H.J. Lu wrote:
>>>
>>> This caused:
>>>
>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49519
>>
>> I'm checking this in as an alternate fix.  Testing hasn't completed yet, but
>> I'm confident that this version is safe.
>>
>
> I still got the same failure with revision 175368.  The problem is caused by
> the "While looking at this, I've also changed a few more TYPE_MAIN_VARIANTs
> to cv_unqualified" change in
>
> http://gcc.gnu.org/ml/gcc-patches/2011-06/msg01622.html

Revert this patch:


seems to fix the crash.
Kirill Yukhin - July 1, 2011, 5:36 a.m.
Hi Jason,
I've had looked into the problem and I believe, that problem is
somehow connected to FE.
Moreover, it is really look like that it is connected to
array-to-pointer conversion.

I put lots of details in the bug:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49519

Here is very short description:
C++ code looks like this:
include/base/thread_management.h:
        template <typename PFun, typename C, typename ArgList>
        static inline void do_call (PFun     fun_ptr,
                                    C       &obj,
                                    ArgList &arg_list,
                                    internal::return_value<RT> &ret_val,
                                    const int2type<4> &)
          {
            ret_val.set ((obj.*fun_ptr) (arg_list.template get<0>(),
                                         arg_list.template get<1>(),
                                         arg_list.template get<2>(),
                                         arg_list.template get<3>()));

While after "einline" phase it becomes:
  [include/boost/tuple/detail/tuple_basic.hpp : 130:14] D.167199_17 =
MEM[(struct cons &)arg_list_2(D) + 12].head;
  [include/boost/tuple/detail/tuple_basic.hpp : 130:14] D.167198_18 =
MEM[(struct cons &)arg_list_2(D) + 8].head;
  [include/boost/tuple/detail/tuple_basic.hpp : 130:14] D.167197_19 =
MEM[(struct cons &)arg_list_2(D) + 4].head;
  [step-14.cc : 4271:1] D.167196_20 = MEM[(struct cons &)arg_list_2(D)];
  [include/base/thread_management.h : 1534:13] D.167205_21 =
(sizetype)fun_ptr$__delta_7;
  [include/base/thread_management.h : 1534:13] D.167204_22 = obj_1(D)
+D.167205_21;
  [include/base/thread_management.h : 1534:13] iftmp.53_23
(D.167204_22,D.167196_20, D.167197_19, D.167198_18, D.167199_17);
  [include/base/thread_management.h : 1826:5] return;

Could you please prompt me if this is a correct code? I believe - not

Thanks, K


On Fri, Jun 24, 2011 at 8:23 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Thu, Jun 23, 2011 at 8:07 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Thu, Jun 23, 2011 at 7:18 PM, Jason Merrill <jason@redhat.com> wrote:
>>> On 06/23/2011 08:45 PM, H.J. Lu wrote:
>>>>
>>>> This caused:
>>>>
>>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49519
>>>
>>> I'm checking this in as an alternate fix.  Testing hasn't completed yet, but
>>> I'm confident that this version is safe.
>>>
>>
>> I still got the same failure with revision 175368.  The problem is caused by
>> the "While looking at this, I've also changed a few more TYPE_MAIN_VARIANTs
>> to cv_unqualified" change in
>>
>> http://gcc.gnu.org/ml/gcc-patches/2011-06/msg01622.html
>
> Revert this patch:
>
> diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
> index 4d2caa8..2716f78 100644
> --- a/gcc/cp/pt.c
> +++ b/gcc/cp/pt.c
> @@ -10246,7 +10246,7 @@ tsubst_arg_types (tree arg_types,
>
>     /* Do array-to-pointer, function-to-pointer conversion, and ignore
>        top-level qualifiers as required.  */
> -    type = TYPE_MAIN_VARIANT (type_decays_to (type));
> +    type = cv_unqualified (type_decays_to (type));
>
>     /* We do not substitute into default arguments here.  The standard
>        mandates that they be instantiated only when needed, which is
>
> seems to fix the crash.
>
> --
> H.J.
>

Patch

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 4d2caa8..2716f78 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -10246,7 +10246,7 @@  tsubst_arg_types (tree arg_types,

     /* Do array-to-pointer, function-to-pointer conversion, and ignore
        top-level qualifiers as required.  */
-    type = TYPE_MAIN_VARIANT (type_decays_to (type));
+    type = cv_unqualified (type_decays_to (type));

     /* We do not substitute into default arguments here.  The standard
        mandates that they be instantiated only when needed, which is