summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java18
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java11
2 files changed, 28 insertions, 1 deletions
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 372773a..e07b132 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
@@ -6883,7 +6883,23 @@ public class AST2TemplateTests extends AST2BaseTest {
assertEquals("bool", ASTTypeUtil.getType(td.getType()));
ah.assertProblem("B<int*>::type", "type");
}
-
+
+ // template <typename From>
+ // struct is_convertible {
+ // static char check(From);
+ // static From from;
+ // static const int value = sizeof(check(from));
+ // };
+ // template <int>
+ // struct S {
+ // typedef int type;
+ // };
+ // struct Cat {};
+ // typedef S<is_convertible<Cat>::value>::type T;
+ public void testDependentExpressionInvolvingField_388623() throws Exception {
+ parseAndCheckBindings(getAboveComment(), CPP, true);
+ }
+
// struct S {
// typedef int a_type;
// };
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java
index 783547f..ea7f4f8 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalBinding.java
@@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.IValue;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
@@ -351,6 +352,16 @@ public class EvalBinding extends CPPEvaluation {
binding = CPPTemplates.createSpecialization((ICPPClassSpecialization) owner,
binding, point);
}
+ } else if (binding instanceof ICPPField) {
+ IBinding owner = binding.getOwner();
+ if (owner instanceof ICPPClassTemplate) {
+ owner = resolveUnknown(CPPTemplates.createDeferredInstance((ICPPClassTemplate) owner),
+ tpMap, packOffset, within, point);
+ }
+ if (owner instanceof ICPPClassSpecialization) {
+ binding = CPPTemplates.createSpecialization((ICPPClassSpecialization) owner,
+ binding, point);
+ }
}
if (binding == fBinding)
return this;