From 51c06fe8cc93ee9d193e9304a5d7173bb5b1ef58 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 9 Jul 2008 09:52:30 +0000 Subject: [PATCH] NPE in type-comparison, bug 238614. --- .../eclipse/cdt/internal/pdom/tests/PDOMCBugsTest.java | 2 +- .../core/dom/parser/cpp/semantics/CPPVisitor.java | 4 +++- .../core/dom/parser/cpp/semantics/SemanticUtil.java | 10 ++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMCBugsTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMCBugsTest.java index e978995197a..f2e60ce8b6a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMCBugsTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMCBugsTest.java @@ -94,7 +94,7 @@ public class PDOMCBugsTest extends BaseTestCase { IFunctionType ft= (IFunctionType) type; assertEquals("int (int)", ASTTypeUtil.getType(ft)); } else { - assertNull("expected null, got "+type, type); + assertTrue("expected ITypedef, got "+type, type == null || type instanceof ITypedef); } } 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 daebe7729ee..d25ab8a72fe 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 @@ -1771,7 +1771,9 @@ public class CPPVisitor { ICPPClassScope cScope = (ICPPClassScope) s; IType type = cScope.getClassType(); if (type instanceof ICPPClassTemplate) { - type = (IType) CPPTemplates.instantiateWithinClassTemplate((ICPPClassTemplate) type); + IBinding within = CPPTemplates.instantiateWithinClassTemplate((ICPPClassTemplate) type); + if (within instanceof ICPPClassType) + type = (ICPPClassType)within; } if (dtor.isConst() || dtor.isVolatile()) type = new CPPQualifierType(type, dtor.isConst(), dtor.isVolatile()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java index aeb94691c30..9981b3fd4f9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java @@ -169,7 +169,10 @@ public class SemanticUtil { try { while( true ){ if( type instanceof ITypedef ) { - type= ((ITypedef)type).getType(); + IType tt= ((ITypedef)type).getType(); + if (tt == null) + return type; + type= tt; } else if( type instanceof IQualifierType ) { type= ((IQualifierType)type).getType(); } else if( stopAtPointerToMember && type instanceof ICPPPointerToMemberType ) @@ -200,7 +203,10 @@ public class SemanticUtil { try { while( true ){ if( type instanceof ITypedef ) { - type = ((ITypedef)type).getType(); + IType tt= ((ITypedef)type).getType(); + if (tt == null) + return type; + type= tt; } else if( type instanceof IQualifierType ) { type = ((IQualifierType)type).getType(); } else if( type instanceof ICPPReferenceType ) {