diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 99d0ecc46ab..3c8ba19e5b0 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -6056,4 +6056,19 @@ public class AST2TemplateTests extends AST2BaseTest { public void testPointerToMemberAsDependentExpression_391001() throws Exception { parseAndCheckBindings(getAboveComment(), CPP, true); } + + // class Memory { }; + // Memory memory; + // template struct Container { + // struct iterator { + // int test; + // }; + // }; + // int main() { + // Container<&memory>::iterator it; + // it.test; // Field 'test' could not be resolved + // } + public void testAddressAsTemplateArgument_391190() throws Exception { + parseAndCheckBindings(getAboveComment(), CPP, true); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java index 8fb39d3c2e7..a0bd08dcc20 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java @@ -370,7 +370,10 @@ public class Value implements IValue { * Tests whether the value depends on a template parameter. */ public static boolean isDependentValue(IValue nonTypeValue) { - return nonTypeValue != null && nonTypeValue.getEvaluation() != null; + if (nonTypeValue == null) + return false; + ICPPEvaluation eval = nonTypeValue.getEvaluation(); + return eval != null && eval.isValueDependent(); } /** diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java index 0be176e51d3..a3a8017e8da 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java @@ -30,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; @@ -159,7 +160,10 @@ class PDOMCPPClassScope implements ICPPClassScope, IIndexScope { if (!lookup.isPrefixLookup()) { if (CharArrayUtils.equals(fBinding.getNameCharArray(), nameChars)) { if (CPPClassScope.shallReturnConstructors(lookup.getLookupName(), false)){ - return fBinding.getConstructors(); + if (fBinding instanceof ICPPClassSpecialization) { + return ((ICPPClassSpecialization) fBinding).getConstructors(lookup.getLookupPoint()); + } + return fBinding.getConstructors(); } return new IBinding[] {getClassNameBinding()}; }