Bug 53540 - C++11: using fails to be equivalent to typedef
Summary: C++11: using fails to be equivalent to typedef
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.7.0
: P3 normal
Target Milestone: ---
Assignee: Dodji Seketeli
URL:
Keywords: rejects-valid
: 54309 (view as bug list)
Depends on:
Blocks: 54309
  Show dependency treegraph
 
Reported: 2012-05-31 14:38 UTC by Akim Demaille
Modified: 2013-05-03 09:54 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2012-05-31 00:00:00


Attachments
test case (145 bytes, application/octet-stream)
2012-05-31 14:38 UTC, Akim Demaille
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Akim Demaille 2012-05-31 14:38:48 UTC
Created attachment 27532 [details]
test case

Hi all,

I hope this is not a bogus bug report, I apologize if there is something I misunderstood.  I observed the following with both 4.7.0 and "4.8":

g++-mp-4.7 (MacPorts gcc47 4.7.0_3) 4.7.0
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

g++-mp-4.8 (MacPorts gcc48 4.8-20120527_1) 4.8.0 20120527 (experimental)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

In the following example, I import a type name from a templates struct with "using", and do the same with "typedef".  The latter works, but "using" does not seem to find the definition.  clang finds it though (but then again, my understanding might be wrong).

If "function" is not templated, there is no problem.


$ cat foo.cc
template <typename T>
struct context
{
  typedef int type;
};

template <typename T>
void function()
{
  using ctx1 = context<T>;
  typename ctx1::type f1;

  typedef context<T> ctx2;
  typename ctx2::type f2;
}

int main()
{
  function<int>();
}


$ g++-mp-4.8 -Wall -std=c++11 foo.cc
foo.cc: In instantiation of 'void function() [with T = int]':
foo.cc:19:17:   required from here
foo.cc:11:23: error: no type named 'type' in 'using ctx1 = struct context<T>'
   typename ctx1::type f1;
                       ^
foo.cc:14:23: warning: unused variable 'f2' [-Wunused-variable]
   typename ctx2::type f2;
                       ^
Comment 1 Jonathan Wakely 2012-05-31 17:42:41 UTC
I think it's valid, CC'ing Dodji for confirmation.
Comment 2 Akim Demaille 2012-06-11 17:27:13 UTC
(In reply to comment #1)
> I think it's valid, CC'ing Dodji for confirmation.

Any news?
Comment 3 Dodji Seketeli 2012-08-16 19:09:39 UTC
Sorry, I am getting to this just now.
Comment 4 dodji@seketeli.org 2012-08-16 19:11:01 UTC
> I think it's valid, CC'ing Dodji for confirmation.

I agree this is a bug.  I am looking into it.
Comment 5 dodji@seketeli.org 2012-08-16 22:18:36 UTC
A candidate patch was sent to  http://gcc.gnu.org/ml/gcc-patches/2012-08/msg01111.html.
Comment 6 Paolo Carlini 2012-10-05 21:29:25 UTC
Dodji, time to ping? ;)
Comment 7 dodji@seketeli.org 2012-10-08 14:26:37 UTC
"paolo.carlini at oracle dot com" <gcc-bugzilla@gcc.gnu.org> a écrit:

> Dodji, time to ping? ;)

Right:  http://gcc.gnu.org/ml/gcc-patches/2012-10/msg00766.html.

:)
Comment 8 Dodji Seketeli 2012-10-10 10:44:02 UTC
Author: dodji
Date: Wed Oct 10 10:43:53 2012
New Revision: 192304

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=192304
Log:
PR c++/53540 - using fails to be equivalent to typedef

In the example of this problem report, during the substituting of int
into 'function', tsubst_aggr_type fails for the alias ctxt1.  This is
because TYPE_TEMPLATE_INFO looks for the TEMPLATE_INFO of the ctxt1
alias at the wrong place and was wrongly finding it to be NULL.
Namely, it was looking for it in the DECL_TEMPLATE_INFO of the
declaration of the type -- as if ctxt1 was an alias template
specialization -- rather than looking for it in its
CLASSTYPE_TEMPLATE_INFO.

Fixed thus.  The other hunks of the patch are a cleanup to make a
better use of alias_template_specialization_p.

Bootstrapped and tested on x86_64-unknown-linux-gnu against trunk.

gcc/cp

	* cp-tree.h (TYPE_TEMPLATE_INFO): For an alias that is not an
	instance of alias template, don't look for its TEMPLATE_INFO in
	its declaration.
	(alias_template_specialization_p): Take const_tree.
	* pt.c (alias_template_specialization_p): Take a const_tree.
	Don't call primary_template_instantiation_p.
	(primary_template_instantiation_p): Call
	alias_template_specialization_p.

gcc/testsuite/

	* g++.dg/cpp0x/alias-decl-24.C: New test.

Added:
    trunk/gcc/testsuite/g++.dg/cpp0x/alias-decl-24.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/cp-tree.h
    trunk/gcc/cp/pt.c
    trunk/gcc/testsuite/ChangeLog
Comment 9 Dodji Seketeli 2012-10-10 10:57:38 UTC
Fixed in trunk (4.8)
Comment 10 Paolo Carlini 2013-05-03 09:54:21 UTC
*** Bug 54309 has been marked as a duplicate of this bug. ***