PR c++/54466 - ICE with alias template which type-id is const qualified
authorDodji Seketeli <dodji@redhat.com>
Tue, 13 Nov 2012 16:07:39 +0000 (16:07 +0000)
committerDodji Seketeli <dodji@gcc.gnu.org>
Tue, 13 Nov 2012 16:07:39 +0000 (17:07 +0100)
Consider this short example:

    template<typename T>
      struct X { };

    template<typename T>
      using Y = const X<T>;

    using Z = Y<int>;

G++ crashes in lookup_class_template_1 while trying to build the alias
template instantiation Y<int>.

I think this is indirectly due to the fact that that
lookup_class_template_1 can now yield a const qualified type like
'const X<T>'.

As a consequence, the code in lookup_template_class_1 that was trying
to access the TYPE_STUB_DECL field of the result of
lookup_template_class_1 should now be adjusted to access the
TYPE_STUB_DECL of the main variant of the resulting type instead (and
that is TYPE_MAIN_DECL); because qualified types (constructed with
build_qualified_type) have their TYPE_STUB_DECL set to NULL.

Fixed thus and tested on x86_64-unknown-linux-gnu against trunk.

gcc/cp

PR c++/54466
* pt.c (lookup_template_class_1): TYPE_STUB_DECL should be
accessed on the main variant of the type.

gcc/testsuite/

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

In the example of this patch, g++ crashes when trying to build the
alias template Y<int

From-SVN: r193479

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/alias-decl-26.C [new file with mode: 0644]

index cb861cb66744dbf80a93c698e4072b44c35003cc..0f23cbca9b7c4ba9238e00862787f07adcf8939e 100644 (file)
@@ -1,3 +1,9 @@
+2012-11-13  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/54466
+       * pt.c (lookup_template_class_1): TYPE_STUB_DECL should be
+       accessed on the main variant of the type.
+
 2012-11-12  Ed Smith-Rowland  <3dw4rd@verizon.net>
 
        * parser.c (cp_parser_objc_class_ivars):
index 50d12b08348c4b4dbcdfd8274b4224051aae9664..802c79b875579ef9f7c5d80732bc27a7eed2aac3 100644 (file)
@@ -7372,9 +7372,9 @@ lookup_template_class_1 (tree d1, tree arglist, tree in_decl, tree context,
       if (CLASS_TYPE_P (template_type))
        {
          TREE_PRIVATE (type_decl)
-           = TREE_PRIVATE (TYPE_STUB_DECL (template_type));
+           = TREE_PRIVATE (TYPE_MAIN_DECL (template_type));
          TREE_PROTECTED (type_decl)
-           = TREE_PROTECTED (TYPE_STUB_DECL (template_type));
+           = TREE_PROTECTED (TYPE_MAIN_DECL (template_type));
          if (CLASSTYPE_VISIBILITY_SPECIFIED (template_type))
            {
              DECL_VISIBILITY_SPECIFIED (type_decl) = 1;
index 1eba36dd8f832e774f5e3193327641731a7055ea..e82a88fb9a9e0616a487351c1711b90d5ff3a808 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-13  Dodji Seketeli  <dodji@redhat.com>
+
+       PR c++/54466
+       * g++.dg/cpp0x/alias-decl-26.C: New test file.
+
 2012-11-13  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gcc.target/i386/avx256-unaligned-load-2.c: Requre !ia32
diff --git a/gcc/testsuite/g++.dg/cpp0x/alias-decl-26.C b/gcc/testsuite/g++.dg/cpp0x/alias-decl-26.C
new file mode 100644 (file)
index 0000000..dd4cc02
--- /dev/null
@@ -0,0 +1,10 @@
+// Origin: PR c++/54466
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+  struct X { };
+
+template<typename T>
+  using Y = const X<T>;
+
+using Z = Y<int>;