mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-24 16:30:53 +08:00
re PR c++/53619 ([C++11] wrong capture of "this" in lambda in case of multiple inheritance)
PR c++/53619 * pt.c (in_template_function): New. * cp-tree.h: Declare it. * class.c (build_base_path, resolves_to_fixed_type_p): Use it. From-SVN: r189191
This commit is contained in:
parent
39fa0adb69
commit
e0e1b35743
@ -1,5 +1,10 @@
|
||||
2012-07-02 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/53619
|
||||
* pt.c (in_template_function): New.
|
||||
* cp-tree.h: Declare it.
|
||||
* class.c (build_base_path, resolves_to_fixed_type_p): Use it.
|
||||
|
||||
PR c++/53783
|
||||
* pt.c (tsubst_copy_and_build) [LAMBDA_EXPR]: Use tsubst
|
||||
for LAMBDA_EXPR_EXTRA_SCOPE.
|
||||
|
@ -325,8 +325,7 @@ build_base_path (enum tree_code code,
|
||||
up properly yet, and the value doesn't matter there either; we're just
|
||||
interested in the result of overload resolution. */
|
||||
if (cp_unevaluated_operand != 0
|
||||
|| (current_function_decl
|
||||
&& uses_template_parms (current_function_decl)))
|
||||
|| in_template_function ())
|
||||
{
|
||||
expr = build_nop (ptr_target_type, expr);
|
||||
if (!want_pointer)
|
||||
@ -6523,8 +6522,7 @@ resolves_to_fixed_type_p (tree instance, int* nonnull)
|
||||
|
||||
/* processing_template_decl can be false in a template if we're in
|
||||
fold_non_dependent_expr, but we still want to suppress this check. */
|
||||
if (current_function_decl
|
||||
&& uses_template_parms (current_function_decl))
|
||||
if (in_template_function ())
|
||||
{
|
||||
/* In a template we only care about the type of the result. */
|
||||
if (nonnull)
|
||||
|
@ -5330,6 +5330,7 @@ extern tree lookup_template_class (tree, tree, tree, tree,
|
||||
extern tree lookup_template_function (tree, tree);
|
||||
extern int uses_template_parms (tree);
|
||||
extern int uses_template_parms_level (tree, int);
|
||||
extern bool in_template_function (void);
|
||||
extern tree instantiate_class_template (tree);
|
||||
extern tree instantiate_template (tree, tree, tsubst_flags_t);
|
||||
extern int fn_type_unification (tree, tree, tree,
|
||||
|
17
gcc/cp/pt.c
17
gcc/cp/pt.c
@ -8027,6 +8027,23 @@ uses_template_parms (tree t)
|
||||
return dependent_p;
|
||||
}
|
||||
|
||||
/* Returns true iff current_function_decl is an incompletely instantiated
|
||||
template. Useful instead of processing_template_decl because the latter
|
||||
is set to 0 during fold_non_dependent_expr. */
|
||||
|
||||
bool
|
||||
in_template_function (void)
|
||||
{
|
||||
tree fn = current_function_decl;
|
||||
bool ret;
|
||||
++processing_template_decl;
|
||||
ret = (fn && DECL_LANG_SPECIFIC (fn)
|
||||
&& DECL_TEMPLATE_INFO (fn)
|
||||
&& any_dependent_template_arguments_p (DECL_TI_ARGS (fn)));
|
||||
--processing_template_decl;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Returns true if T depends on any template parameter with level LEVEL. */
|
||||
|
||||
int
|
||||
|
@ -1,5 +1,8 @@
|
||||
2012-07-02 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/53619
|
||||
* g++.dg/cpp0x/lambda/lambda-this5.C: New.
|
||||
|
||||
PR c++/53783
|
||||
* g++.dg/cpp0x/lambda/lambda-template7.C: New.
|
||||
|
||||
|
22
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C
Normal file
22
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this5.C
Normal file
@ -0,0 +1,22 @@
|
||||
// PR c++/53619
|
||||
// { dg-do run { target c++11 } }
|
||||
|
||||
struct C {
|
||||
int x;
|
||||
};
|
||||
struct B {
|
||||
int q;
|
||||
};
|
||||
struct A : public B , C {
|
||||
void foo();
|
||||
};
|
||||
|
||||
void A::foo() {
|
||||
auto k = [this]() {return (void *)(&x);};
|
||||
if (k() != (void*)&x)
|
||||
__builtin_abort();
|
||||
}
|
||||
|
||||
int main(int l, char **) {
|
||||
A a; a.foo();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user