]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/50848 (ICE in derived template class missing using for member of template...
authorJason Merrill <jason@redhat.com>
Tue, 8 Nov 2011 01:10:43 +0000 (20:10 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 8 Nov 2011 01:10:43 +0000 (20:10 -0500)
PR c++/50848
* pt.c (tsubst_copy_and_build) [CALL_EXPR]: Don't crash
if lookup finds a non-function.

From-SVN: r181143

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/lookup9.C [new file with mode: 0644]

index 92025a98e6bc32d77bc52cca0ca5d8a53a1c014f..98e0fe36fc01029e7aa5ef31a4b7cf58c6690296 100644 (file)
@@ -1,5 +1,9 @@
 2011-11-07  Jason Merrill  <jason@redhat.com>
 
+       PR c++/50848
+       * pt.c (tsubst_copy_and_build) [CALL_EXPR]: Don't crash
+       if lookup finds a non-function.
+
        PR c++/50863
        * parser.c (cp_parser_initializer_list): Parse C99
        array designators tentatively.
index 53a53580deae44cfbf7c4becfca50e5406e7d2ed..bf2a2c637356e18454967be4a1893e6d385d8d19 100644 (file)
@@ -13673,6 +13673,8 @@ tsubst_copy_and_build (tree t,
                if (unq != function)
                  {
                    tree fn = unq;
+                   if (TREE_CODE (fn) == INDIRECT_REF)
+                     fn = TREE_OPERAND (fn, 0);
                    if (TREE_CODE (fn) == COMPONENT_REF)
                      fn = TREE_OPERAND (fn, 1);
                    if (is_overloaded_fn (fn))
@@ -13682,7 +13684,9 @@ tsubst_copy_and_build (tree t,
                               "and no declarations were found by "
                               "argument-dependent lookup at the point "
                               "of instantiation", function);
-                   if (DECL_CLASS_SCOPE_P (fn))
+                   if (!DECL_P (fn))
+                     /* Can't say anything more.  */;
+                   else if (DECL_CLASS_SCOPE_P (fn))
                      {
                        inform (EXPR_LOC_OR_HERE (t),
                                "declarations in dependent base %qT are "
index c5f4118d2ad3b14dacd4e0b4717def5e430447d9..875e0997d21196f5b7c2e1c7adadb9c64bb486d8 100644 (file)
@@ -1,5 +1,8 @@
 2011-11-07  Jason Merrill  <jason@redhat.com>
 
+       PR c++/50848
+       * g++.dg/template/lookup9.C: New.
+
        PR c++/50863
        * g++.dg/cpp0x/lambda/lambda-initlist1.C: New.
 
diff --git a/gcc/testsuite/g++.dg/template/lookup9.C b/gcc/testsuite/g++.dg/template/lookup9.C
new file mode 100644 (file)
index 0000000..4a1dc79
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/50848
+// { dg-options "-fpermissive" }
+
+template<class T> class A {T& foo;};
+template<class T> class B: public A<T> {
+  void f(){
+    foo(1);                    // { dg-message "foo" }
+  }
+};
+template class B<int>;