[Issue 4430] Regression(2.037) erroneous matching on specialized template function

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Sep 1 11:57:49 PDT 2010


http://d.puremagic.com/issues/show_bug.cgi?id=4430


Don <clugdbug at yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch, rejects-valid


--- Comment #4 from Don <clugdbug at yahoo.com.au> 2010-09-01 11:57:33 PDT ---
This bug was triggered by svn commit 273, which was related to opDispatch.
The immediate change was in CallExp::semantic(). Previously, it attempted full
explicit instantiation, and if that failed, it tried partial explicit
instantiation. In this case, the full explicit instantiation was failing
(because there were two candidate templates), and then partial instantiation
succeeded. 
After svn 273, it calls needsTypeInference(). If that returns true, it does
partial instantiation, otherwise does full instantiation. In this example, it's
returning false.

There is a situation missing from needsTypeInference(). If there is more than
one candidate template, and they are ALL function templates, and they are ALL 
potentially explicitly instantiated, we need to do partial instantiation.

Template.c, needsTypeInference(), around line 4625.


Index: template.c
===================================================================
--- template.c    (revision 655)
+++ template.c    (working copy)
@@ -4622,6 +4622,7 @@
     //printf("TemplateInstance::needsTypeInference() %s\n", toChars());
     if (!tempdecl)
         tempdecl = findTemplateDeclaration(sc);
+    int multipleMatches = FALSE;
     for (TemplateDeclaration *td = tempdecl; td; td = td->overnext)
     {
         /* If any of the overloaded template declarations need inference,
@@ -4647,9 +4648,14 @@
         if (Parameter::dim(fdtype->parameters) &&
             (tp || tiargs->dim < td->parameters->dim))
             return TRUE;
+        /* If there is more than one function template which matches, we may
need type inference
+         */
+        if (td != tempdecl)
+            multipleMatches = TRUE;
     }
     //printf("false\n");
-    return FALSE;
+    return multipleMatches;
 }

 void TemplateInstance::semantic2(Scope *sc)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list