pt.c (maybe_adjust_types_for_deduction, [...]): Remove spurious information in comment.
authorNathan Sidwell <nathan@codesourcery.com>
Mon, 12 Feb 2001 14:38:25 +0000 (14:38 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Mon, 12 Feb 2001 14:38:25 +0000 (14:38 +0000)
cp:
* pt.c (maybe_adjust_types_for_deduction, DEDUCE_ORDER case):
Remove spurious information in comment. Allow further
adjustments of REFERENCE_TYPE args.
testsuite:
* g++.old-deja/g++.pt/spec40.C: New test.

From-SVN: r39604

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.pt/spec40.C [new file with mode: 0644]

index 3f7b3922d49b2c02230cc119875ce529346f2b25..d1685b38ea8b2e2b5fbd66ed312343d7ba6ae33d 100644 (file)
@@ -1,3 +1,9 @@
+2001-02-12  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * pt.c (maybe_adjust_types_for_deduction, DEDUCE_ORDER case):
+       Remove spurious information in comment. Allow further
+       adjustments of REFERENCE_TYPE args.
+
 2001-02-12  Nathan Sidwell  <nathan@codesourcery.com>
 
        * errfn.c (cp_deprecated): Tweak diagnostic text.
index aa77e638636f70c3934ec39039e1ac9bb46429db..bad8117162d13b8fd1ee0481b2d92063572af6ae 100644 (file)
@@ -7833,31 +7833,18 @@ maybe_adjust_types_for_deduction (strict, parm, arg)
          compiler accepts it).
 
          John also confirms that deduction should proceed as in a function
-         call. Which implies the usual ARG and PARM bashing as DEDUCE_CALL.
+         call. Which implies the usual ARG and PARM conversions as DEDUCE_CALL.
          However, in ordering, ARG can have REFERENCE_TYPE, but no argument
          to an actual call can have such a type.
          
-         When deducing against a REFERENCE_TYPE, we can either not change
-         PARM's type, or we can change ARG's type too. The latter, though
-         seemingly more safe, turns out to give the following quirk. Consider
-         deducing a call to a `const int *' with the following template 
-         function parameters 
-           #1; T const *const &   ; T = int
-           #2; T *const &         ; T = const int
-           #3; T *                ; T = const int
-         It looks like #1 is the more specialized.  Taken pairwise, #1 is
-         more specialized than #2 and #2 is more specialized than #3, yet
-         there is no ordering between #1 and #3.
-         
-         So, if ARG is a reference, we look though it when PARM is
-         not a refence. When both are references we don't change either.  */
+         If both ARG and PARM are REFERENCE_TYPE, we change neither.
+         If only ARG is a REFERENCE_TYPE, we look through that and then
+         proceed as with DEDUCE_CALL (which could further convert it).  */
       if (TREE_CODE (*arg) == REFERENCE_TYPE)
         {
           if (TREE_CODE (*parm) == REFERENCE_TYPE)
             return 0;
           *arg = TREE_TYPE (*arg);
-          result |= UNIFY_ALLOW_OUTER_LESS_CV_QUAL;
-          goto skip_arg;
         }
       break;
     default:
@@ -7890,7 +7877,6 @@ maybe_adjust_types_for_deduction (strict, parm, arg)
        *arg = TYPE_MAIN_VARIANT (*arg);
     }
   
-  skip_arg:;
   /* [temp.deduct.call]
      
      If P is a cv-qualified type, the top level cv-qualifiers
index de55bb37764ff6838d5d559443eb4d60ce45d96d..4607aa8f6d27d748df62efca2b6195ef3f899788 100644 (file)
@@ -1,3 +1,7 @@
+2001-02-12  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.pt/spec40.C: New test.
+
 2001-02-12  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.old-deja/g++.robertl/eb63.C: Remove new initializer list
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/spec40.C b/gcc/testsuite/g++.old-deja/g++.pt/spec40.C
new file mode 100644 (file)
index 0000000..2d0ad90
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 12 Feb 2001 <nathan@codesourcery.com>
+
+// More from bug 1617. We didn't resolve partial ordering properly. The
+// std is rather vague about it anyway, DR 214 talks about this.
+
+template <typename T> int Foo (T const *) {return 1;}
+template <unsigned I> int Foo (char const (&)[I]) {return 2;}
+
+int main ()
+{
+  return Foo ("a") != 2;
+}