From b5cde3b61c728b73e686a0f19c9954ff229c10d5 Mon Sep 17 00:00:00 2001 From: Marco Stornelli Date: Sat, 18 Jan 2020 09:27:52 +0100 Subject: [PATCH] Bug 559313 - decltype evaluated as a write operation If a variable is in a decl type specifier can't be evaluated as written. Change-Id: If78a567dab99e55c78e16c3b7f10c45bbd0a0606 Signed-off-by: Marco Stornelli --- .../tests/ast2/VariableReadWriteFlagsTest.java | 12 ++++++++++++ .../core/dom/parser/VariableReadWriteFlags.java | 3 +++ 2 files changed, 15 insertions(+) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/VariableReadWriteFlagsTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/VariableReadWriteFlagsTest.java index 5eb63ee3714..a0111a56922 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/VariableReadWriteFlagsTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/VariableReadWriteFlagsTest.java @@ -245,4 +245,16 @@ public class VariableReadWriteFlagsTest extends AST2TestBase { a.assertReadWriteFlags("a = arr[0];", "arr", READ); a.assertReadWriteFlags("return arr[0];", "arr", READ); } + + // class Test { + // public: + // int v; + // void test() const { + // decltype(v) o = 14; + // } + // }; + public void testDeclType() throws Exception { + AssertionHelper a = getCPPAssertionHelper(); + a.assertReadWriteFlags("decltype(v) o = 14;", "v", READ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/VariableReadWriteFlags.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/VariableReadWriteFlags.java index a7bc98a9041..1d58c90b89a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/VariableReadWriteFlags.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/VariableReadWriteFlags.java @@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.IASTCaseStatement; import org.eclipse.cdt.core.dom.ast.IASTCastExpression; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression; +import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDoStatement; import org.eclipse.cdt.core.dom.ast.IASTEqualsInitializer; @@ -81,6 +82,8 @@ public abstract class VariableReadWriteFlags { return READ; // dimension } else if (parent instanceof IASTInitializerList) { return rwInInitializerList((IASTInitializerList) parent, indirection); + } else if (parent instanceof IASTDeclSpecifier) { + return READ; } return READ | WRITE; // fallback }