diff options
author | Jason Merrill <jason@redhat.com> | 2009-10-12 00:39:04 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2009-10-12 00:39:04 -0400 |
commit | 45fe7947ed05c189b2010011593f9226326d06da (patch) | |
tree | 1d54db99f0113265799ae34c01951cd5bad4827c | |
parent | 420bc2e7aaf96b0da5e89857f7edc08fa45a1f36 (diff) | |
download | gcc-45fe7947ed05c189b2010011593f9226326d06da.zip gcc-45fe7947ed05c189b2010011593f9226326d06da.tar.gz gcc-45fe7947ed05c189b2010011593f9226326d06da.tar.bz2 |
re PR c++/37204 ([c++0x] reinterpret_cast<T&&>(v) incorrectly yields an lvalue)
PR c++/37204
* typeck.c (build_reinterpret_cast_1): Handle rvalue refs
properly.
From-SVN: r152661
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C | 11 |
4 files changed, 28 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 67a5dea..d2a46b2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-10-11 Jason Merrill <jason@redhat.com> + + PR c++/37204 + * typeck.c (build_reinterpret_cast_1): Handle rvalue refs + properly. + 2009-10-11 Richard Guenther <rguenther@suse.de> * tree.c (cp_free_lang_data): Drop anonymous aggregate names. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 526e706..3392fac 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -5599,12 +5599,17 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p, intype, type); expr = cp_build_unary_op (ADDR_EXPR, expr, 0, complain); + + if (warn_strict_aliasing > 2) + strict_aliasing_warning (TREE_TYPE (expr), type, expr); + if (expr != error_mark_node) expr = build_reinterpret_cast_1 (build_pointer_type (TREE_TYPE (type)), expr, c_cast_p, valid_p, complain); if (expr != error_mark_node) - expr = cp_build_indirect_ref (expr, 0, complain); + /* cp_build_indirect_ref isn't right for rvalue refs. */ + expr = convert_from_reference (fold_convert (type, expr)); return expr; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4865c0d..dad5cb4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-10-11 Jason Merrill <jason@redhat.com> + + PR c++/37204 + * g++.dg/cpp0x/rv-reinterpret.C: New. + 2009-10-11 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR libgfortran/38439 diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C b/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C new file mode 100644 index 0000000..5b6e4c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-reinterpret.C @@ -0,0 +1,11 @@ +// { dg-options -std=c++0x } +// { dg-do run } + +void f(int &); +void f(int &&ir) { ir = 42; } +int main() +{ + int x; + f(reinterpret_cast<int&&>(x)); + return (x != 42); +} |