From e2e471d83d16449a325315c0f33dc52b90ce0fac Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 31 May 2022 16:31:35 -0400 Subject: [PATCH] c++: auto and dependent member name [PR105734] In r12-3643 I improved our handling of type names after . or -> when unqualified lookup doesn't find anything, but it needs to handle auto specially. PR c++/105734 gcc/cp/ChangeLog: * parser.cc (cp_parser_postfix_dot_deref_expression): Use typeof if the expression has auto type. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/auto57.C: New test. --- gcc/cp/parser.cc | 2 +- gcc/testsuite/g++.dg/cpp0x/auto57.C | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/auto57.C diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 0eefa740dc56..3fc73442da54 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -8262,7 +8262,7 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser, tree type = TREE_TYPE (postfix_expression); /* If we don't have a (type-dependent) object of class type, use typeof to figure out the type of the object. */ - if (type == NULL_TREE) + if (type == NULL_TREE || is_auto (type)) type = finish_typeof (postfix_expression); parser->context->object_type = type; } diff --git a/gcc/testsuite/g++.dg/cpp0x/auto57.C b/gcc/testsuite/g++.dg/cpp0x/auto57.C new file mode 100644 index 000000000000..fedcfde2f0c5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto57.C @@ -0,0 +1,15 @@ +// PR c++/105734 +// { dg-do compile { target c++11 } } + +namespace N { + struct A { }; + A f(A); +} + +template +void bar() { + auto m = f(T()); + m.~A(); +} + +void foo() { bar(); }