]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/7019 ([3.3 only] SFINAE does not work with explicitally specified template...
authorMark Mitchell <mark@codesourcery.com>
Mon, 14 Jul 2003 19:05:05 +0000 (19:05 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 14 Jul 2003 19:05:05 +0000 (19:05 +0000)
PR c++/7019
* cp-tree.h (lookup_qualified_name): Adjust prototype.
* decl.c (lookup_qualified_name): Add complain parameter.  Adjust
call to is_aggr_type.
* parser.c (cp_parser_lookup_name): Adjust call to
lookup_qualified_name.
* pt.c (tsubst_qualified_id): Likewise.
(tsubst_copy_and_build): Likewise.
* semantics.c (finish_qualified_id_expr): Deal with erroneous
expressions.

PR c++/7019
* g++.dg/template/overload2.C: New test.

From-SVN: r69342

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/overload2.C [new file with mode: 0644]

index 8318b914020507ee629a9f9e21e76743015e63ab..e84ea849f81b980295ec079ddf2b2e8482092860 100644 (file)
@@ -1,3 +1,16 @@
+2003-07-14  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/7019
+       * cp-tree.h (lookup_qualified_name): Adjust prototype.
+       * decl.c (lookup_qualified_name): Add complain parameter.  Adjust
+       call to is_aggr_type.
+       * parser.c (cp_parser_lookup_name): Adjust call to
+       lookup_qualified_name.
+       * pt.c (tsubst_qualified_id): Likewise.
+       (tsubst_copy_and_build): Likewise.
+       * semantics.c (finish_qualified_id_expr): Deal with erroneous
+       expressions.
+
 2003-07-14  Gabriel Dos Reis <gdr@integrable-solutions.net>
 
        PR c++/11510
index 8658be6d93a8db088b5d995a74e0d9e176234344..acc4528f9efe7920efcd9ffb47f5d7cd9b241041 100644 (file)
@@ -3679,7 +3679,7 @@ extern tree make_typename_type                    (tree, tree, tsubst_flags_t);
 extern tree make_unbound_class_template                (tree, tree, tsubst_flags_t);
 extern tree lookup_name_nonclass               (tree);
 extern tree lookup_function_nonclass            (tree, tree);
-extern tree lookup_qualified_name               (tree, tree, bool);
+extern tree lookup_qualified_name               (tree, tree, bool, bool);
 extern tree lookup_name                                (tree, int);
 extern tree lookup_name_current_level          (tree);
 extern tree lookup_type_current_level          (tree);
index d4c212f3e7665c2e71dcf693b7bba035ea119ca7..2daaee60c0e2b9c5efcddd5086e122e5be670375 100644 (file)
@@ -5761,10 +5761,12 @@ qualify_lookup (tree val, int flags)
    bindings.  
 
    Returns a DECL (or OVERLOAD, or BASELINK) representing the
-   declaration found.  */
+   declaration found.  If no suitable declaration can be found,
+   ERROR_MARK_NODE is returned.  Iif COMPLAIN is true and SCOPE is
+   neither a class-type nor a namespace a diagnostic is issued.  */
 
 tree
-lookup_qualified_name (tree scope, tree name, bool is_type_p)
+lookup_qualified_name (tree scope, tree name, bool is_type_p, bool complain)
 {
   int flags = 0;
 
@@ -5776,15 +5778,19 @@ lookup_qualified_name (tree scope, tree name, bool is_type_p)
       flags |= LOOKUP_COMPLAIN;
       if (is_type_p)
        flags |= LOOKUP_PREFER_TYPES;
-      if (!qualified_lookup_using_namespace (name, scope, &binding, 
-                                            flags))
-       return NULL_TREE;
-      return select_decl (&binding, flags);
+      if (qualified_lookup_using_namespace (name, scope, &binding, 
+                                           flags))
+       return select_decl (&binding, flags);
     }
-  else if (is_aggr_type (scope, /*or_else=*/1))
-    return lookup_member (scope, name, 0, is_type_p);
-  else
-    return error_mark_node;
+  else if (is_aggr_type (scope, complain))
+    {
+      tree t;
+      t = lookup_member (scope, name, 0, is_type_p);
+      if (t)
+       return t;
+    }
+
+  return error_mark_node;
 }
 
 /* Check to see whether or not DECL is a variable that would have been
index 98411a6abdbb745855cfe3512388ac18432784cd..bfce0ca8d34877096979cc5f40eb2d0564853043 100644 (file)
@@ -12825,7 +12825,8 @@ cp_parser_lookup_name (cp_parser *parser, tree name,
             may be instantiated during name lookup.  In that case,
             errors may be issued.  Even if we rollback the current
             tentative parse, those errors are valid.  */
-         decl = lookup_qualified_name (parser->scope, name, is_type);
+         decl = lookup_qualified_name (parser->scope, name, is_type,
+                                       /*complain=*/true);
          if (dependent_p)
            pop_scope (parser->scope);
        }
index ee9d2459d7eb64627b98fdf5037aa7e7df46daaa..1f7822ca72b1dcea9ee7aae9202bcefb22da0ea6 100644 (file)
@@ -7149,9 +7149,9 @@ tsubst_qualified_id (tree qualified_id, tree args,
     }
   else
     expr = name;
-  if (!BASELINK_P (name)
-      && !DECL_P (expr))
-    expr = lookup_qualified_name (scope, expr, /*is_type_p=*/0);
+  if (!BASELINK_P (name) && !DECL_P (expr))
+    expr = lookup_qualified_name (scope, expr, /*is_type_p=*/0,
+                                 (complain & tf_error) != 0);
   if (DECL_P (expr))
     check_accessibility_of_qualified_id (expr, 
                                         /*object_type=*/NULL_TREE,
@@ -7611,7 +7611,8 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
            scope = tsubst_expr (scope, args, complain, in_decl);
            do_local_using_decl (lookup_qualified_name (scope,
                                                        name, 
-                                                       /*is_type_p=*/0));
+                                                       /*is_type_p=*/0,
+                                                       /*complain=*/true));
          }
        else
          {
@@ -8285,7 +8286,8 @@ tsubst_copy_and_build (tree t,
            args = TREE_OPERAND (TREE_OPERAND (member, 1), 1);
            member = lookup_qualified_name (TREE_OPERAND (member, 0),
                                            tmpl, 
-                                           /*is_type=*/0);
+                                           /*is_type=*/0,
+                                           /*complain=*/true);
            if (BASELINK_P (member))
              BASELINK_FUNCTIONS (member) 
                = build_nt (TEMPLATE_ID_EXPR, BASELINK_FUNCTIONS (member),
index ab9376b48a687f7aa94d9b2ae57941e997e293ca..9a9ae20e1bec756c8271da37218598f18b1aa6c4 100644 (file)
@@ -1343,6 +1343,9 @@ tree
 finish_qualified_id_expr (tree qualifying_class, tree expr, bool done,
                          bool address_p)
 {
+  if (error_operand_p (expr))
+    return error_mark_node;
+
   /* If EXPR occurs as the operand of '&', use special handling that
      permits a pointer-to-member.  */
   if (address_p && done)
index c279efebd63c394e89a2629e258d0f281d55e69e..9a4b06245eb284a25e611e55e0a8c6d788d4f3f0 100644 (file)
@@ -1,3 +1,8 @@
+2003-07-14  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/7019
+       * g++.dg/template/overload2.C: New test.
+
 2003-07-14  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>
 
        PR optimization/11440
diff --git a/gcc/testsuite/g++.dg/template/overload2.C b/gcc/testsuite/g++.dg/template/overload2.C
new file mode 100644 (file)
index 0000000..253d055
--- /dev/null
@@ -0,0 +1,15 @@
+template <class T, int (T::*)> struct foo;
+
+template <class T>
+int f(foo<T,&T::ob_type>*);
+
+template <class T>
+char* f(...);
+
+struct X { int ob_type; };
+struct Y { char* ob_type; };
+  int x = f<X>(0);
+char* y = f<Y>(0);
+char* z = f<int>(0);
+
+int main() { return 0; }