re PR c++/34776 (ICE with invalid member declaration in template class)
authorPaolo Carlini <pcarlini@suse.de>
Mon, 21 Jan 2008 01:49:29 +0000 (01:49 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 21 Jan 2008 01:49:29 +0000 (01:49 +0000)
/cp
2008-01-20  Paolo Carlini  <pcarlini@suse.de>

        PR c++/34776
PR c++/34486
        * name-lookup.c (do_class_using_decl): Do not call constructor_name_p
on non-IS_AGGR_TYPE type scope.
(constructor_name_p): Assert IS_AGGR_TYPE.

/testsuite
2008-01-20  Paolo Carlini  <pcarlini@suse.de>

        PR c++/34776
PR c++/34486
        * g++.dg/template/crash75.C: New.
        * g++.dg/template/crash76.C: Likewise.

From-SVN: r131686

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/crash75.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/crash76.C [new file with mode: 0644]

index 91909a1..453ad48 100644 (file)
@@ -1,3 +1,11 @@
+2008-01-20  Paolo Carlini  <pcarlini@suse.de>
+
+        PR c++/34776
+       PR c++/34486
+        * name-lookup.c (do_class_using_decl): Do not call constructor_name_p
+       on non-IS_AGGR_TYPE scope.
+       (constructor_name_p): Assert IS_AGGR_TYPE.
+
 2008-01-18  Ian Lance Taylor  <iant@google.com>
 
        PR c++/33407
index 98c866f..c21940c 100644 (file)
@@ -1730,13 +1730,16 @@ constructor_name (tree type)
   return name;
 }
 
-/* Returns TRUE if NAME is the name for the constructor for TYPE.  */
+/* Returns TRUE if NAME is the name for the constructor for TYPE,
+   which must be a class type.  */
 
 bool
 constructor_name_p (tree name, tree type)
 {
   tree ctor_name;
 
+  gcc_assert (IS_AGGR_TYPE (type));
+
   if (!name)
     return false;
 
@@ -2824,7 +2827,7 @@ do_class_using_decl (tree scope, tree name)
       error ("%<%T::%D%> names destructor", scope, name);
       return NULL_TREE;
     }
-  if (constructor_name_p (name, scope))
+  if (IS_AGGR_TYPE (scope) && constructor_name_p (name, scope))
     {
       error ("%<%T::%D%> names constructor", scope, name);
       return NULL_TREE;
index d0e0656..f45329e 100644 (file)
@@ -1,3 +1,10 @@
+2008-01-20  Paolo Carlini  <pcarlini@suse.de>
+
+        PR c++/34776
+       PR c++/34486
+        * g++.dg/template/crash75.C: New.
+        * g++.dg/template/crash76.C: Likewise. 
+
 2008-01-20  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        PR rtl-optimization/34808
diff --git a/gcc/testsuite/g++.dg/template/crash75.C b/gcc/testsuite/g++.dg/template/crash75.C
new file mode 100644 (file)
index 0000000..462be95
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/34776
+
+template<typename T> struct A
+{
+  T::X<0> x; // { dg-error "non-template|T::template|base type" }
+};
+
+A<int*> a;
diff --git a/gcc/testsuite/g++.dg/template/crash76.C b/gcc/testsuite/g++.dg/template/crash76.C
new file mode 100644 (file)
index 0000000..851cdd8
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/34486
+
+template<typename> struct A
+{
+  typedef A* X;
+};
+
+template<typename T> struct B
+{
+  using A<T>::X::Y; // { dg-error "not a base type" }
+};
+
+B<int> b;