From 499bc0f1a7709a0d544a43b168ca2dd56fade8e9 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Wed, 21 Aug 2013 01:34:39 -0400 Subject: [PATCH] Bug 380751 - Support decltype(expr)::name in an expression context Change-Id: I8af2eb83c12bd8ebe9da58e3ddc4a2a77be47332 Signed-off-by: Nathan Ridge Reviewed-on: https://git.eclipse.org/r/15683 Reviewed-by: Sergey Prigogin IP-Clean: Sergey Prigogin Tested-by: Sergey Prigogin --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 2 ++ .../core/dom/parser/cpp/GNUCPPSourceParser.java | 13 ++++++++++++- 2 files changed, 14 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 6c6071671be..3a243584187 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 @@ -10347,11 +10347,13 @@ public class AST2CPPTests extends AST2TestBase { // class Waldo { // typedef int type; + // static int value; // }; // // int main() { // Waldo w; // decltype(w)::type i; + // int x = decltype(w)::value; // } public void testDecltypeInNameQualifier_bug380751() 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 b8981c921cc..694cb931f88 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 @@ -1541,6 +1541,16 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { case IToken.t_decltype: case IToken.t_void: case IGCCToken.t_typeof: + if (LT(1) == IToken.t_decltype) { + // Might be an id-expression starting with a decltype-specifier. + IToken marked = mark(); + try { + firstExpression = primaryExpression(ctx, strat); + break; + } catch (BacktrackException e) { + backup(marked); + } + } firstExpression = simpleTypeConstructorExpression(simpleTypeSpecifier()); break; @@ -1738,7 +1748,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { case IToken.tCOLONCOLON: case IToken.t_operator: case IToken.tCOMPLETION: - case IToken.tBITCOMPLEMENT: { + case IToken.tBITCOMPLEMENT: + case IToken.t_decltype: { IASTName name = qualifiedName(ctx, strat); IASTIdExpression idExpression = nodeFactory.newIdExpression(name); return setRange(idExpression, name);