summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Ridge2012-12-05 21:28:31 (EST)
committer Sergey Prigogin2012-12-07 15:00:30 (EST)
commita9cbaf44fcf101f24f5f0f7c2db7edd63f2751ee (patch)
tree478109615d5c14d7850bb93f3c75ae631837eccb
parent6697364dcef7368c64fe375a08f32cd0b51a8666 (diff)
downloadorg.eclipse.cdt-a9cbaf44fcf101f24f5f0f7c2db7edd63f2751ee.zip
org.eclipse.cdt-a9cbaf44fcf101f24f5f0f7c2db7edd63f2751ee.tar.gz
org.eclipse.cdt-a9cbaf44fcf101f24f5f0f7c2db7edd63f2751ee.tar.bz2
Bug 388623 - [regression] Error involving dependent expressions
Change-Id: I5d32ca41b7d87d0f220b192889e3908a0f7c84fd Reviewed-on: https://git.eclipse.org/r/9057 Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com> IP-Clean: Sergey Prigogin <eclipse.sprigogin@gmail.com> Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
-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;