Commit e8c66fe0 by Nathan Sidwell Committed by Nathan Sidwell

re PR c++/18949 (trouble with const_cast in templates)

cp:
	PR c++/18949
	* pt.c (tsubst_copy_and_build): <INDIRECT_REF case> Check that a
	REFERENCE_REF_P is dereferencing a reference type.
	* typeck.c (build_static_cast): Convert from reference even in a
	template.
	(build_reinterpret_cast, build_const_cast, build_c_cast): Likewise.
testsuite:
	PR c++/18949
	* g++.dg/template/cast1.C: New.

From-SVN: r92136
parent 3a42aebe
2004-12-14 Nathan Sidwell <nathan@codesourcery.com>
PR c++/18949
* pt.c (tsubst_copy_and_build): <INDIRECT_REF case> Check that a
REFERENCE_REF_P is dereferencing a reference type.
* typeck.c (build_static_cast): Convert from reference even in a
template.
(build_reinterpret_cast, build_const_cast, build_c_cast): Likewise.
2004-12-14 Volker Reichelt <reichelt@igpm.rwth-aachen.de> 2004-12-14 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
* parser.c (cp_parser_uncommitted_to_tentative_parse_p): New function. * parser.c (cp_parser_uncommitted_to_tentative_parse_p): New function.
......
...@@ -8395,7 +8395,10 @@ tsubst_copy_and_build (tree t, ...@@ -8395,7 +8395,10 @@ tsubst_copy_and_build (tree t,
if (REFERENCE_REF_P (t)) if (REFERENCE_REF_P (t))
{ {
gcc_assert (TREE_CODE (TREE_TYPE (r)) == REFERENCE_TYPE); /* A type conversion to reference type will be enclosed in
such an indirect ref, but the substitution of the cast
will have also added such an indirect ref. */
if (TREE_CODE (TREE_TYPE (r)) == REFERENCE_TYPE)
r = convert_from_reference (r); r = convert_from_reference (r);
} }
else else
......
...@@ -4767,7 +4767,7 @@ build_static_cast (tree type, tree expr) ...@@ -4767,7 +4767,7 @@ build_static_cast (tree type, tree expr)
expr = build_min (STATIC_CAST_EXPR, type, expr); expr = build_min (STATIC_CAST_EXPR, type, expr);
/* We don't know if it will or will not have side effects. */ /* We don't know if it will or will not have side effects. */
TREE_SIDE_EFFECTS (expr) = 1; TREE_SIDE_EFFECTS (expr) = 1;
return expr; return convert_from_reference (expr);
} }
/* build_c_cast puts on a NOP_EXPR to make the result not an lvalue. /* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
...@@ -4983,7 +4983,7 @@ build_reinterpret_cast (tree type, tree expr) ...@@ -4983,7 +4983,7 @@ build_reinterpret_cast (tree type, tree expr)
&& type_dependent_expression_p (expr)) && type_dependent_expression_p (expr))
/* There might turn out to be side effects inside expr. */ /* There might turn out to be side effects inside expr. */
TREE_SIDE_EFFECTS (t) = 1; TREE_SIDE_EFFECTS (t) = 1;
return t; return convert_from_reference (t);
} }
return build_reinterpret_cast_1 (type, expr, /*c_cast_p=*/false, return build_reinterpret_cast_1 (type, expr, /*c_cast_p=*/false,
...@@ -5111,7 +5111,7 @@ build_const_cast (tree type, tree expr) ...@@ -5111,7 +5111,7 @@ build_const_cast (tree type, tree expr)
&& type_dependent_expression_p (expr)) && type_dependent_expression_p (expr))
/* There might turn out to be side effects inside expr. */ /* There might turn out to be side effects inside expr. */
TREE_SIDE_EFFECTS (t) = 1; TREE_SIDE_EFFECTS (t) = 1;
return t; return convert_from_reference (t);
} }
return build_const_cast_1 (type, expr, /*complain=*/true, return build_const_cast_1 (type, expr, /*complain=*/true,
...@@ -5137,7 +5137,7 @@ build_c_cast (tree type, tree expr) ...@@ -5137,7 +5137,7 @@ build_c_cast (tree type, tree expr)
tree_cons (NULL_TREE, value, NULL_TREE)); tree_cons (NULL_TREE, value, NULL_TREE));
/* We don't know if it will or will not have side effects. */ /* We don't know if it will or will not have side effects. */
TREE_SIDE_EFFECTS (t) = 1; TREE_SIDE_EFFECTS (t) = 1;
return t; return convert_from_reference (t);
} }
/* Casts to a (pointer to a) specific ObjC class (or 'id' or /* Casts to a (pointer to a) specific ObjC class (or 'id' or
......
2004-12-14 Nathan Sidwell <nathan@codesourcery.com>
PR c++/18949
* g++.dg/template/cast1.C: New.
2004-12-13 Richard Henderson <rth@redhat.com> 2004-12-13 Richard Henderson <rth@redhat.com>
* gcc.dg/i386-sse-10.c: Fix typo in options. * gcc.dg/i386-sse-10.c: Fix typo in options.
......
// { dg-do compile }
// Copyright (C) 2004 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 14 Dec 2004 <nathan@codesourcery.com>
// PR 18949. Forgot to convert from reference.
// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
struct A
{
void foo();
};
template<int> void bar(A& a)
{
const_cast<A&>(a).foo();
static_cast<A&>(a).foo();
reinterpret_cast<A&>(a).foo();
((A&)a).foo();
}
template void bar<0>(A& a);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment