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:
parent
1e159409fc
commit
cd6baa162d
4 changed files with 50 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
21
gcc/testsuite/g++.dg/tm/pr47747.C
Normal file
21
gcc/testsuite/g++.dg/tm/pr47747.C
Normal 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" } */
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue