From cb76eaa873864124a3e468812d2b1482199e1cc3 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 24 Mar 2016 21:16:57 -0400 Subject: [PATCH] Bug 489876 - Virt-specifier following trailing-return-type Change-Id: I1c86634cbb69c0e4b2243dc858abe4c048335378 --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 10 ++++++++++ .../core/dom/parser/cpp/GNUCPPSourceParser.java | 14 ++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index c7754ae4017..1be4d449c87 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -10056,6 +10056,16 @@ public class AST2CPPTests extends AST2TestBase { parseAndCheckBindings(); } + // struct Base { + // virtual bool waldo(); + // }; + // struct Derived : Base { + // virtual auto waldo() -> bool override; + // }; + public void testOverrideSpecifierAfterTrailingReturnType_489876() throws Exception { + parseAndCheckBindings(); + } + // struct CHAINER { // CHAINER const & operator,(int x) const; // }; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index 409428a5f5f..7e80f489d06 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -4177,8 +4177,18 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { case IToken.tCOLONCOLON: case IToken.tIDENTIFIER: case IToken.tCOMPLETION: - if (option.fRequireAbstract) - throwBacktrack(LA(1)); + if (option.fRequireAbstract) { + // We might have a virt-specifier following a type-id in a trailing-return-type. + ContextSensitiveTokenType contextSensitiveType = getContextSensitiveType(LA(1)); + if (contextSensitiveType == ContextSensitiveTokenType.OVERRIDE || + contextSensitiveType == ContextSensitiveTokenType.FINAL) { + // In that case, we're done parsing the declarator of the type-id. + break; + } else { + // Otherwise, we have what looks like a name, but we're not expecting one. + throwBacktrack(LA(1)); + } + } final IASTName declaratorName= !option.fRequireSimpleName ? qualifiedName() : identifier(); endOffset= calculateEndOffset(declaratorName);