re PR c++/35711 (bad text in -Wcast-qual warning (forgets volatile))

2009-04-21  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

	PR c++/35711
cp/
	* typeck.c (check_for_casting_away_constness): We diagnose casting
	away any qualifiers not just constness.
	(casts_away_constness): Mention that it handles more than just
	constness.
testsuite/
	* g++.dg/warn/pr35711.C: New.
	* g++.dg/conversion/ptrmem2.C: Update.

From-SVN: r146537
parent ad41bd84
2009-04-21 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/35711
* typeck.c (check_for_casting_away_constness): We diagnose casting
away any qualifiers not just constness.
(casts_away_constness): Mention that it handles more than just
constness.
2009-04-21 Joseph Myers <joseph@codesourcery.com>
* ChangeLog, ChangeLog-1993, ChangeLog-1994, ChangeLog-1995,
......
......@@ -5038,7 +5038,12 @@ cp_build_compound_expr (tree lhs, tree rhs, tsubst_flags_t complain)
}
/* Issue a diagnostic message if casting from SRC_TYPE to DEST_TYPE
casts away constness. CAST gives the type of cast. */
casts away constness. CAST gives the type of cast.
??? This function warns for casting away any qualifier not just
const. We would like to specify exactly what qualifiers are casted
away.
*/
static void
check_for_casting_away_constness (tree src_type, tree dest_type,
......@@ -5049,27 +5054,29 @@ check_for_casting_away_constness (tree src_type, tree dest_type,
if (cast == CAST_EXPR && !warn_cast_qual)
return;
if (casts_away_constness (src_type, dest_type))
switch (cast)
{
case CAST_EXPR:
warning (OPT_Wcast_qual,
"cast from type %qT to type %qT casts away constness",
src_type, dest_type);
return;
case STATIC_CAST_EXPR:
error ("static_cast from type %qT to type %qT casts away constness",
src_type, dest_type);
return;
case REINTERPRET_CAST_EXPR:
error ("reinterpret_cast from type %qT to type %qT casts away constness",
if (!casts_away_constness (src_type, dest_type))
return;
switch (cast)
{
case CAST_EXPR:
warning (OPT_Wcast_qual,
"cast from type %qT to type %qT casts away qualifiers",
src_type, dest_type);
return;
default:
gcc_unreachable();
}
return;
case STATIC_CAST_EXPR:
error ("static_cast from type %qT to type %qT casts away qualifiers",
src_type, dest_type);
return;
case REINTERPRET_CAST_EXPR:
error ("reinterpret_cast from type %qT to type %qT casts away qualifiers",
src_type, dest_type);
return;
default:
gcc_unreachable();
}
}
/* Convert EXPR (an expression with pointer-to-member type) to TYPE
......@@ -7362,7 +7369,12 @@ casts_away_constness_r (tree *t1, tree *t2)
}
/* Returns nonzero if casting from TYPE1 to TYPE2 casts away
constness. */
constness.
??? This function returns non-zero if casting away qualifiers not
just const. We would like to return to the caller exactly which
qualifiers are casted away to give more accurate diagnostics.
*/
static bool
casts_away_constness (tree t1, tree t2)
......
2009-04-21 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/35711
* g++.dg/warn/pr35711.C: New.
* g++.dg/conversion/ptrmem2.C: Update.
2009-04-21 Joseph Myers <joseph@codesourcery.com>
* ChangeLog, ChangeLog-1993-2007, ChangeLog-2008, ChangeLog.ptr,
......
......@@ -31,8 +31,8 @@ const int B::*p9 = static_cast<const int B::*>(&D::x);
const int D::*p10 = static_cast<const int D::*>(&B::x);
// Invalid conversions which decrease cv-qualification.
int B::*p11 = static_cast<int B::*>(p10); // { dg-error "casts away constness" }
int D::*p12 = static_cast<int D::*>(p9); // { dg-error "casts away constness" }
int B::*p11 = static_cast<int B::*>(p10); // { dg-error "casts away qualifiers" }
int D::*p12 = static_cast<int D::*>(p9); // { dg-error "casts away qualifiers" }
// Attempts to change member type.
float B::*p13 = static_cast<float B::*>(&D::x); // { dg-error "" }
......
// PR 35711
// { dg-do compile }
// { dg-options "-Wcast-qual" }
int* foo (volatile int *p)
{
return (int*)p; // { dg-warning "cast from type 'volatile int\\*' to type 'int\\*' casts away qualifiers" }
}
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