PR47747: Fix error messages for calls to unsafe virtual functions.

gcc/
	* trans-mem.c (diagnose_tm_1): Print an expression instead of a
	declaration in error messages for indirect calls.

	testsuite/
	g++.dg/tm/pr47747.C: New test.

From-SVN: r181602
This commit is contained in:
Torvald Riegel 2011-11-21 22:29:31 +00:00 committed by Torvald Riegel
parent 1e159409fc
commit cd6baa162d
4 changed files with 50 additions and 6 deletions

View file

@ -1,3 +1,8 @@
2011-11-21 Torvald Riegel <triegel@redhat.com>
* trans-mem.c (diagnose_tm_1): Print an expression instead of a
declaration in error messages for indirect calls.
2011-11-21 David S. Miller <davem@davemloft.net>
* config/sparc/sparc.c (sparc_regmode_natural_size): New function

View file

@ -1,3 +1,7 @@
2011-11-21 Torvald Riegel <triegel@redhat.com>
* g++.dg/tm/pr47747.C: New test.
2011-11-21 Torvald Riegel <triegel@redhat.com>
* g++.dg/tm/template-2.C: New test.

View file

@ -0,0 +1,21 @@
// { dg-do compile }
// { dg-options "-fgnu-tm -O" }
class InputStream
{
public:
// __attribute__((transaction_safe))
virtual unsigned int readUint32 () = 0;
};
class Building
{
public:
__attribute__((transaction_safe))
Building (InputStream *stream);
};
Building::Building (InputStream *stream)
{
stream->readUint32 (); /* { dg-error "InputStream::readUint32" } */
}

View file

@ -659,13 +659,27 @@ diagnose_tm_1 (gimple_stmt_iterator *gsi, bool *handled_ops_p,
if (TREE_CODE (fn) == ADDR_EXPR)
fn = TREE_OPERAND (fn, 0);
if (d->block_flags & DIAG_TM_SAFE)
error_at (gimple_location (stmt),
"unsafe function call %qD within "
"atomic transaction", fn);
{
if (direct_call_p)
error_at (gimple_location (stmt),
"unsafe function call %qD within "
"atomic transaction", fn);
else
error_at (gimple_location (stmt),
"unsafe function call %qE within "
"atomic transaction", fn);
}
else
error_at (gimple_location (stmt),
"unsafe function call %qD within "
"%<transaction_safe%> function", fn);
{
if (direct_call_p)
error_at (gimple_location (stmt),
"unsafe function call %qD within "
"%<transaction_safe%> function", fn);
else
error_at (gimple_location (stmt),
"unsafe function call %qE within "
"%<transaction_safe%> function", fn);
}
}
}
}