| author | Nathan Ridge | 2012-12-06 18:24:01 (EST) |
|---|---|---|
| committer | Sergey Prigogin | 2012-12-07 15:01:51 (EST) |
| commit | 66bb47cde05056696b6c31d46949f13e6f914804 (patch) (side-by-side diff) | |
| tree | 5a870c8c2d39797f58dc81fcf3fdc623e52d841c | |
| parent | a9cbaf44fcf101f24f5f0f7c2db7edd63f2751ee (diff) | |
| download | org.eclipse.cdt-66bb47cde05056696b6c31d46949f13e6f914804.zip org.eclipse.cdt-66bb47cde05056696b6c31d46949f13e6f914804.tar.gz org.eclipse.cdt-66bb47cde05056696b6c31d46949f13e6f914804.tar.bz2 | |
Bug 395019 - Error when using __is_base_of
Change-Id: Ife9a63658555b7a94246b0d938dd139bb8d0ab08
Reviewed-on: https://git.eclipse.org/r/9060
Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
IP-Clean: Sergey Prigogin <eclipse.sprigogin@gmail.com>
Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
2 files changed, 17 insertions, 3 deletions
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 c58b157..97b8e1f 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 @@ -9953,8 +9953,8 @@ public class AST2CPPTests extends AST2BaseTest { // template<int I> struct CT {}; // typedef int TD; // bool operator==(S1 a, int r ); - // static const int x = sizeof(CT<i>((TD * (CT<sizeof(s1 == 1)>::*)) 0 )); - // template<int I> bool operator==(S1 a, const CT<I>& r ); + // static const int x = sizeof(CT<i>((TD * (CT<sizeof(s1 == 1)>::*)) 0)); + // template<int I> bool operator==(S1 a, const CT<I>& r); public void testOrderInAmbiguityResolution_390759() throws Exception { parseAndCheckBindings(); } @@ -9973,4 +9973,16 @@ public class AST2CPPTests extends AST2BaseTest { public void testADLForFunctionObject_388287() throws Exception { parseAndCheckBindings(); } + + // template <bool> struct A {}; + // template <> + // struct A<false> { + // typedef int type; + // }; + // struct S {}; + // const bool b = __is_base_of(S, int); + // typedef A<b>::type T; + public void testIsBaseOf_395019() 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 79fb138..40e95a7 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 @@ -334,8 +334,10 @@ public class Value implements IValue { IType type1, IType type2, IASTNode point) { switch (operator) { case __is_base_of: - if (type1 instanceof ICPPClassType && type1 instanceof ICPPClassType) { + if (type1 instanceof ICPPClassType && type2 instanceof ICPPClassType) { return ClassTypeHelper.isSubclass((ICPPClassType) type2, (ICPPClassType) type1) ? 1 : 0; + } else { + return 0; } } return VALUE_CANNOT_BE_DETERMINED; |

