From 6674aae1e1421a2d600bf9d0a1e501873a88b8f6 Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 26 May 2011 03:06:09 +0000 Subject: [PATCH] PR c++/45401 * decl.c (grokdeclarator): Don't change type when adding rvalue ref to another reference type. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@174260 138bc75d-0d04-0410-961f-82ee72b054a4 index de53541..b3de096 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -9017,13 +9017,18 @@ grokdeclarator (const cp_declarator *declarator, to create the type "rvalue reference to cv TD' creates the type TD." */ - if (!VOID_TYPE_P (type)) + if (VOID_TYPE_P (type)) + /* We already gave an error. */; + else if (TREE_CODE (type) == REFERENCE_TYPE) + { + if (declarator->u.reference.rvalue_ref) + /* Leave type alone. */; + else + type = cp_build_reference_type (TREE_TYPE (type), false); + } + else type = cp_build_reference_type - ((TREE_CODE (type) == REFERENCE_TYPE - ? TREE_TYPE (type) : type), - (declarator->u.reference.rvalue_ref - && (TREE_CODE(type) != REFERENCE_TYPE - || TYPE_REF_IS_RVALUE (type)))); + (type, declarator->u.reference.rvalue_ref); /* In C++0x, we need this check for direct reference to reference declarations, which are forbidden by new file mode 100644 index 0000000..569ee5b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/rv-restrict.C @@ -0,0 +1,6 @@ +// PR c++/45401 +// { dg-options -std=c++0x } + +typedef int &__restrict restrictLvref; +typedef restrictLvref &&rvrefToRestrictLvref; +typedef restrictLvref rvrefToRestrictLvref; -- 1.7.0.4