re PR c++/49520 ([C++0x] using-declaration and operator&& confuses constexpr)
PR c++/49520 * semantics.c (constexpr_fn_retval): Handle CLEANUP_POINT_EXPR here. (massage_constexpr_body): Not here. From-SVN: r175658
This commit is contained in:
parent
40d55020a3
commit
11324716c1
5 changed files with 29 additions and 3 deletions
|
@ -1,5 +1,9 @@
|
|||
2011-06-29 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/49520
|
||||
* semantics.c (constexpr_fn_retval): Handle CLEANUP_POINT_EXPR here.
|
||||
(massage_constexpr_body): Not here.
|
||||
|
||||
PR c++/49554
|
||||
* semantics.c (lambda_proxy_type): New.
|
||||
(build_capture_proxy): Use it.
|
||||
|
|
|
@ -207,7 +207,7 @@ DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", tcc_type, 0)
|
|||
DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0)
|
||||
|
||||
/* A using directive. The operand is USING_STMT_NAMESPACE. */
|
||||
DEFTREECODE (USING_STMT, "using_directive", tcc_statement, 1)
|
||||
DEFTREECODE (USING_STMT, "using_stmt", tcc_statement, 1)
|
||||
|
||||
/* An un-parsed default argument. Holds a vector of input tokens and
|
||||
a vector of places where the argument was instantiated before
|
||||
|
|
|
@ -5657,6 +5657,9 @@ constexpr_fn_retval (tree body)
|
|||
return NULL_TREE;
|
||||
return error_mark_node;
|
||||
|
||||
case CLEANUP_POINT_EXPR:
|
||||
return constexpr_fn_retval (TREE_OPERAND (body, 0));
|
||||
|
||||
case USING_STMT:
|
||||
return NULL_TREE;
|
||||
|
||||
|
@ -5683,8 +5686,6 @@ massage_constexpr_body (tree fun, tree body)
|
|||
body = EH_SPEC_STMTS (body);
|
||||
if (TREE_CODE (body) == MUST_NOT_THROW_EXPR)
|
||||
body = TREE_OPERAND (body, 0);
|
||||
if (TREE_CODE (body) == CLEANUP_POINT_EXPR)
|
||||
body = TREE_OPERAND (body, 0);
|
||||
body = constexpr_fn_retval (body);
|
||||
}
|
||||
return body;
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2011-06-29 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/49520
|
||||
* g++.dg/cpp0x/constexpr-using2.C: New.
|
||||
|
||||
* g++.dg/cpp0x/lambda/lambda-template3.C: New.
|
||||
|
||||
PR c++/45923
|
||||
|
|
18
gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C
Normal file
18
gcc/testsuite/g++.dg/cpp0x/constexpr-using2.C
Normal file
|
@ -0,0 +1,18 @@
|
|||
// PR c++/49520
|
||||
// { dg-options -std=c++0x }
|
||||
|
||||
namespace x { void foo(); }
|
||||
|
||||
template<typename T>
|
||||
struct traits
|
||||
{
|
||||
static constexpr bool f() { return true; }
|
||||
|
||||
static constexpr bool g()
|
||||
{
|
||||
using x::foo;
|
||||
return f() && noexcept(foo());
|
||||
}
|
||||
};
|
||||
|
||||
template struct traits<int>;
|
Loading…
Add table
Reference in a new issue