OSDN Git Service

* pt.c (convert_nontype_argument): Don't call decl_constant_value
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Jul 1999 04:32:17 +0000 (04:32 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Jul 1999 04:32:17 +0000 (04:32 +0000)
if we're converting to a reference type.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@28224 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.old-deja/g++.oliva/template4.C

index c111a86..7844092 100644 (file)
@@ -1,5 +1,8 @@
 1999-07-22  Mark Mitchell  <mark@codesourcery.com>
 
+       * pt.c (convert_nontype_argument): Don't call decl_constant_value
+       if we're converting to a reference type.
+
        * call.c (NEED_TEMPORARY_P): New macro.
        (standard_conversion): Set it, for derived-to-base conversions.
        (reference_related_p): New function.
index 0744812..06b6c13 100644 (file)
@@ -2681,9 +2681,12 @@ convert_nontype_argument (type, expr)
      
      --a pointer to member expressed as described in _expr.unary.op_.  */
 
-  /* An integral constant-expression can include const variables
-     or enumerators.  */
-  if (INTEGRAL_TYPE_P (expr_type) && TREE_READONLY_DECL_P (expr))
+  /* An integral constant-expression can include const variables or
+     enumerators.  Simplify things by folding them to their values,
+     unless we're about to bind the declaration to a reference
+     parameter.  */
+  if (INTEGRAL_TYPE_P (expr_type) && TREE_READONLY_DECL_P (expr)
+      && TREE_CODE (type) != REFERENCE_TYPE)
     expr = decl_constant_value (expr);
 
   if (is_overloaded_fn (expr))
index 5d7f7a6..4c2afc7 100644 (file)
@@ -17,4 +17,4 @@ extern const int c;
 X<c> z; // ok, c has external linkage
 
 extern const int c = 3;
-X<c> z_; // gets bogus error - using c as constant - XFAIL *-*-*
+X<c> z_; // gets bogus error - using c as constant