diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java index 71b4341cedb..dff0c031a63 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java @@ -587,8 +587,8 @@ public class AST2BaseTest extends BaseTestCase { return problemBinding; } - public T assertNonProblemOnFirstIdentifier(String section, Class type, Class... cs) { - return assertNonProblem(section, getIdentifierLength(section), type, cs); + public T assertNonProblemOnFirstIdentifier(String section, Class... cs) { + return assertNonProblem(section, getIdentifierLength(section), cs); } public IBinding assertNonProblemOnFirstIdentifier(String section) { @@ -678,7 +678,7 @@ public class AST2BaseTest extends BaseTestCase { return selector.findImplicitName(offset, len); } - public T assertNode(String context, String nodeText, Class type, Class... cs) { + public T assertNode(String context, String nodeText, Class... cs) { if (context == null) { context = contents; } @@ -688,11 +688,11 @@ public class AST2BaseTest extends BaseTestCase { assertTrue("Node \"" + nodeText + "\" not found", nodeOffset >= 0); IASTNodeSelector selector = tu.getNodeSelector(null); IASTNode node = selector.findNode(offset + nodeOffset, nodeText.length()); - return assertType(node, type, cs); + return assertType(node, cs); } - public T assertNode(String nodeText, Class type, Class... cs) { - return assertNode(contents, nodeText, type, cs); + public T assertNode(String nodeText, Class... cs) { + return assertNode(contents, nodeText, cs); } private String renderProblemID(int i) { @@ -713,31 +713,30 @@ public class AST2BaseTest extends BaseTestCase { return "Unknown problem ID"; } - public T assertNonProblem(String section, int len, Class type, Class... cs) { + public T assertNonProblem(String section, int len, Class... cs) { if (len <= 0) len += section.length(); IBinding binding= binding(section, len); assertTrue("ProblemBinding for name: " + section.substring(0, len), !(binding instanceof IProblemBinding)); - return assertType(binding, type, cs); + return assertType(binding, cs); } - public T assertNonProblem(String section, Class type, Class... cs) { - return assertNonProblem(section, section.length(), type, cs); + public T assertNonProblem(String section, Class... cs) { + return assertNonProblem(section, section.length(), cs); } - public T assertNonProblem(String context, String name, Class type, Class... cs) { + public T assertNonProblem(String context, String name, Class... cs) { IBinding binding= binding(context, name); assertTrue("ProblemBinding for name: " + name, !(binding instanceof IProblemBinding)); - return assertType(binding, type, cs); + return assertType(binding, cs); } - public U assertType(T obj, Class type, Class... cs) { - assertInstance(obj, type); + public U assertType(T obj, Class... cs) { for (Class c : cs) { assertInstance(obj, c); } - return type.cast(obj); + return (U) obj; } private IBinding binding(String section, int len) { 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 5dffa35177c..5908699d91c 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 @@ -8405,6 +8405,7 @@ public class AST2CPPTests extends AST2BaseTest { // } // struct A {}; // A a; + // auto c(a); // auto b = a; // const auto *p = &b, q = ""; // static auto d = 0.0; @@ -8418,6 +8419,8 @@ public class AST2CPPTests extends AST2BaseTest { BindingAssertionHelper bh= new BindingAssertionHelper(code, true); ICPPVariable b= bh.assertNonProblem("b =", 1); assertEquals("A", ASTTypeUtil.getType(b.getType())); + ICPPVariable c= bh.assertNonProblem("c(a)", "c"); + assertEquals("A", ASTTypeUtil.getType(c.getType())); ICPPVariable p= bh.assertNonProblem("p =", 1); assertEquals("const A *", ASTTypeUtil.getType(p.getType())); ICPPVariable q= bh.assertNonProblem("q =", 1); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index bb1138eb81a..4e47369eeae 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -2038,6 +2038,10 @@ public class CPPVisitor extends ASTQueries { IASTInitializer initClause= declarator.getInitializer(); if (initClause instanceof IASTEqualsInitializer) { autoInitClause= (ICPPASTInitializerClause) ((IASTEqualsInitializer) initClause).getInitializerClause(); + } else if (initClause instanceof ICPPASTConstructorInitializer) { + IASTInitializerClause[] arguments = ((ICPPASTConstructorInitializer) initClause).getArguments(); + if (arguments.length == 1) + autoInitClause = (ICPPASTInitializerClause) arguments[0]; } else if (initClause instanceof ICPPASTInitializerClause) { autoInitClause= (ICPPASTInitializerClause) initClause; }