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
This commit is contained in:
parent
3a42aebe0b
commit
e8c66fe0e1
@ -1,3 +1,12 @@
|
||||
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>
|
||||
|
||||
* parser.c (cp_parser_uncommitted_to_tentative_parse_p): New function.
|
||||
|
@ -8395,8 +8395,11 @@ tsubst_copy_and_build (tree t,
|
||||
|
||||
if (REFERENCE_REF_P (t))
|
||||
{
|
||||
gcc_assert (TREE_CODE (TREE_TYPE (r)) == REFERENCE_TYPE);
|
||||
r = convert_from_reference (r);
|
||||
/* 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);
|
||||
}
|
||||
else
|
||||
r = build_x_indirect_ref (r, "unary *");
|
||||
|
@ -4767,7 +4767,7 @@ build_static_cast (tree type, tree expr)
|
||||
expr = build_min (STATIC_CAST_EXPR, type, expr);
|
||||
/* We don't know if it will or will not have side effects. */
|
||||
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.
|
||||
@ -4983,7 +4983,7 @@ build_reinterpret_cast (tree type, tree expr)
|
||||
&& type_dependent_expression_p (expr))
|
||||
/* There might turn out to be side effects inside expr. */
|
||||
TREE_SIDE_EFFECTS (t) = 1;
|
||||
return t;
|
||||
return convert_from_reference (t);
|
||||
}
|
||||
|
||||
return build_reinterpret_cast_1 (type, expr, /*c_cast_p=*/false,
|
||||
@ -5111,7 +5111,7 @@ build_const_cast (tree type, tree expr)
|
||||
&& type_dependent_expression_p (expr))
|
||||
/* There might turn out to be side effects inside expr. */
|
||||
TREE_SIDE_EFFECTS (t) = 1;
|
||||
return t;
|
||||
return convert_from_reference (t);
|
||||
}
|
||||
|
||||
return build_const_cast_1 (type, expr, /*complain=*/true,
|
||||
@ -5137,7 +5137,7 @@ build_c_cast (tree type, tree expr)
|
||||
tree_cons (NULL_TREE, value, NULL_TREE));
|
||||
/* We don't know if it will or will not have side effects. */
|
||||
TREE_SIDE_EFFECTS (t) = 1;
|
||||
return t;
|
||||
return convert_from_reference (t);
|
||||
}
|
||||
|
||||
/* Casts to a (pointer to a) specific ObjC class (or 'id' or
|
||||
|
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
* gcc.dg/i386-sse-10.c: Fix typo in options.
|
||||
|
22
gcc/testsuite/g++.dg/template/cast1.C
Normal file
22
gcc/testsuite/g++.dg/template/cast1.C
Normal file
@ -0,0 +1,22 @@
|
||||
// { 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);
|
Loading…
Reference in New Issue
Block a user