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> 2009-04-21 Joseph Myers <joseph@codesourcery.com>
* ChangeLog, ChangeLog-1993, ChangeLog-1994, ChangeLog-1995, * ChangeLog, ChangeLog-1993, ChangeLog-1994, ChangeLog-1995,
......
...@@ -5038,7 +5038,12 @@ cp_build_compound_expr (tree lhs, tree rhs, tsubst_flags_t complain) ...@@ -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 /* 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 static void
check_for_casting_away_constness (tree src_type, tree dest_type, check_for_casting_away_constness (tree src_type, tree dest_type,
...@@ -5049,22 +5054,24 @@ check_for_casting_away_constness (tree src_type, tree dest_type, ...@@ -5049,22 +5054,24 @@ check_for_casting_away_constness (tree src_type, tree dest_type,
if (cast == CAST_EXPR && !warn_cast_qual) if (cast == CAST_EXPR && !warn_cast_qual)
return; return;
if (casts_away_constness (src_type, dest_type)) if (!casts_away_constness (src_type, dest_type))
return;
switch (cast) switch (cast)
{ {
case CAST_EXPR: case CAST_EXPR:
warning (OPT_Wcast_qual, warning (OPT_Wcast_qual,
"cast from type %qT to type %qT casts away constness", "cast from type %qT to type %qT casts away qualifiers",
src_type, dest_type); src_type, dest_type);
return; return;
case STATIC_CAST_EXPR: case STATIC_CAST_EXPR:
error ("static_cast from type %qT to type %qT casts away constness", error ("static_cast from type %qT to type %qT casts away qualifiers",
src_type, dest_type); src_type, dest_type);
return; return;
case REINTERPRET_CAST_EXPR: case REINTERPRET_CAST_EXPR:
error ("reinterpret_cast from type %qT to type %qT casts away constness", error ("reinterpret_cast from type %qT to type %qT casts away qualifiers",
src_type, dest_type); src_type, dest_type);
return; return;
default: default:
...@@ -7362,7 +7369,12 @@ casts_away_constness_r (tree *t1, tree *t2) ...@@ -7362,7 +7369,12 @@ casts_away_constness_r (tree *t1, tree *t2)
} }
/* Returns nonzero if casting from TYPE1 to TYPE2 casts away /* 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 static bool
casts_away_constness (tree t1, tree t2) 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> 2009-04-21 Joseph Myers <joseph@codesourcery.com>
* ChangeLog, ChangeLog-1993-2007, ChangeLog-2008, ChangeLog.ptr, * ChangeLog, ChangeLog-1993-2007, ChangeLog-2008, ChangeLog.ptr,
......
...@@ -31,8 +31,8 @@ const int B::*p9 = static_cast<const int B::*>(&D::x); ...@@ -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); const int D::*p10 = static_cast<const int D::*>(&B::x);
// Invalid conversions which decrease cv-qualification. // Invalid conversions which decrease cv-qualification.
int B::*p11 = static_cast<int B::*>(p10); // { 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 constness" } int D::*p12 = static_cast<int D::*>(p9); // { dg-error "casts away qualifiers" }
// Attempts to change member type. // Attempts to change member type.
float B::*p13 = static_cast<float B::*>(&D::x); // { dg-error "" } 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