From ce34d2d48e4695646f08f49c266f639a5a676475 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Sat, 28 Feb 2015 19:13:05 -0500 Subject: [PATCH] Bug 460080 - Template id inside special cast expression forming '>>' Change-Id: I949cef0c6774c4c90edce921c2cc99f514ffea87 Signed-off-by: Nathan Ridge --- .../eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java | 6 ++++++ .../internal/core/dom/parser/cpp/GNUCPPSourceParser.java | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) 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 cac2a3abdbe..e8e4d45eb79 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 @@ -11076,4 +11076,10 @@ public class AST2CPPTests extends AST2TestBase { public void testASTCopyForNoexceptDefault_bug456207() throws Exception { parseAndCheckBindings(); } + + // template struct waldo { waldo(int); }; + // auto x = static_cast>(0); + public void testTemplateIdInsideCastOperator_460080() throws Exception { + parseAndCheckBindings(); + } } 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 257647d3413..85a9cf7b274 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 @@ -1957,7 +1957,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { final int optype= consume().getType(); consume(IToken.tLT); final IASTTypeId typeID = typeId(DeclarationOptions.TYPEID); - consumeOrEOC(IToken.tGT); + final IToken gt = LA(1); + if (gt.getType() == IToken.tGT || gt.getType() == IToken.tGT_in_SHIFTR) { + consume(); + } else if (gt.getType() != IToken.tEOC) { + throwBacktrack(gt); + } consumeOrEOC(IToken.tLPAREN); IASTExpression operand= null; if (LT(1) != IToken.tEOC) {