re PR c++/17530 (failure to emit inline function)
authorMark Mitchell <mark@codesourcery.com>
Tue, 21 Sep 2004 05:44:10 +0000 (05:44 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 21 Sep 2004 05:44:10 +0000 (05:44 +0000)
PR c++/17530
* pt.c (tsubst): Fix parentheses to accomodate emacs.
(tsubst_baselink): If we get a single function, mark it as used.

PR c++/17530
* g++.dg/template/static7.C: New test.

From-SVN: r87791

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

index 431e32ae6e5b490403f2631fb1ea5061e35d0d99..6ddc16d3be8d3a55ecdba7d5b0e2aed380ae7621 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-20  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/17530
+       * pt.c (tsubst): Fix parentheses to accomodate emacs.
+       (tsubst_baselink): If we get a single function, mark it as used.
+
 2004-09-20  Matt Austern <austern@apple.com>
            Zack Weinberg  <zack@codesourcery.com>
 
index d7e59039ce4aeb03fdad32effd151d9e99d2f4e9..4d77a8dbd5775460fc49469bbca0091fa4d36537 100644 (file)
@@ -7007,11 +7007,12 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
               single bad template instantiation.  */
            if (complain & tf_error
 #ifdef USE_MAPPED_LOCATION
-               && last_loc != input_location)
+               && last_loc != input_location
 #else
                && (last_loc.line != input_line
-                   || last_loc.file != input_filename))
+                   || last_loc.file != input_filename)
 #endif
+                 )
              {
                if (TREE_CODE (type) == VOID_TYPE)
                  error ("forming reference to void");
@@ -7323,11 +7324,23 @@ tsubst_baselink (tree baselink, tree object_type,
       }
     name = DECL_NAME (get_first_fn (fns));
     baselink = lookup_fnfields (qualifying_scope, name, /*protect=*/1);
+    
+    /* If lookup found a single function, mark it as used at this
+       point.  (If it lookup found multiple functions the one selected
+       later by overload resolution will be marked as used at that
+       point.)  */
+    if (BASELINK_P (baselink))
+      fns = BASELINK_FUNCTIONS (baselink);
+    if (!template_id_p && !really_overloaded_fn (fns))
+      mark_used (OVL_CURRENT (fns));
+
+    /* Add back the template arguments, if present.  */
     if (BASELINK_P (baselink) && template_id_p)
       BASELINK_FUNCTIONS (baselink) 
        = build_nt (TEMPLATE_ID_EXPR,
                    BASELINK_FUNCTIONS (baselink),
                    template_args);
+
     if (!object_type)
       object_type = current_class_type;
     return adjust_result_of_qualified_name_lookup (baselink, 
index 6bfa3e8d9c1ce9a82cb43334d9708af4b25af6ff..2d2e5b63643af45768e933690d8eacfbc32200a9 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-20  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/17530
+       * g++.dg/template/static7.C: New test.
+
 2004-09-20  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR tree-opt/17558 
diff --git a/gcc/testsuite/g++.dg/template/static7.C b/gcc/testsuite/g++.dg/template/static7.C
new file mode 100644 (file)
index 0000000..edb8e6a
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/17530
+// { dg-do link }
+
+typedef void (*Func) ();
+void f (Func) {}
+struct B
+{
+  static void staticfunc () {}
+};
+template <int> 
+void C(){ f (B::staticfunc); }
+int main ()
+{
+  C<0>();
+  return 0;
+}