From cf0b76c58e8f9b1b8a008ca181cc4d85270fa1f6 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Thu, 5 Nov 2015 20:33:17 -0800 Subject: [PATCH] Bug 469788 - Ambiguous node in initializer in trailing return type Change-Id: Iff81cad75a57c9482ada515a9e9a34d5d1a956d3 --- .../parser/tests/ast2/AST2TemplateTests.java | 50 +++++++++++++++++++ .../parser/cpp/CPPASTAmbiguityResolver.java | 12 ++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 440004c08be..18b0134f4f2 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -8866,6 +8866,56 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // template + // struct remove_reference { + // typedef T type; + // }; + // + // template + // struct remove_reference { + // typedef T type; + // }; + // + // template + // struct remove_reference { + // typedef T type; + // }; + // + // template + // T&& waldo(typename remove_reference::type& t); + // + // template + // struct D { + // T t; + // }; + // + // template + // T f(U p); + // + // template + // auto g(U&& t) -> decltype(f>(D{waldo(t)})) { + // return f>(D{waldo(t)}); + // } + // + // struct A {}; + // + // template + // struct B { + // A a; + // + // void method() { + // g(a); + // } + // }; + // + // void test() { + // B b; + // b.method(); + // } + public void testAmbiguityResolution_469788() throws Exception { + parseAndCheckBindings(); + } + // template // struct Base { // template diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguityResolver.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguityResolver.java index 85433c9bde6..819d8f45aad 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguityResolver.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguityResolver.java @@ -30,9 +30,11 @@ import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateSpecialization; @@ -127,10 +129,16 @@ final class CPPASTAmbiguityResolver extends ASTVisitor { // Visit the declarator first, it may contain ambiguous template arguments needed // for associating the template declarations. - fSkipInitializers++; - ASTQueries.findOutermostDeclarator(fdef.getDeclarator()).accept(this); + ICPPASTFunctionDeclarator fdecl = (ICPPASTFunctionDeclarator) fdef.getDeclarator(); + fSkipInitializers++; // Initializers may refer to class members declared later. + fdecl.accept(this); fSkipInitializers--; fdef.getDeclSpecifier().accept(this); + IASTTypeId trailingReturnType = fdecl.getTrailingReturnType(); + if (trailingReturnType != null) { + // Visit initializers inside the trailing return type that were skipped earlier. + trailingReturnType.accept(this); + } // Defer visiting the body of the function until the class body has been visited. fDeferredNodes.getLast().add(decl); return PROCESS_SKIP;