From 772d99ada4d1a975e08294af2872c71cf96f7ff3 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Tue, 10 May 2005 17:24:04 +0000 Subject: [PATCH] type of "this" in a class template member function, fixes bug 74204 --- .../parser/tests/ast2/AST2TemplateTests.java | 28 +++++++++++++++++++ .../core/dom/parser/cpp/CPPVisitor.java | 4 +++ 2 files changed, 32 insertions(+) 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 b00f8c0e634..e80ca2e3c21 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 @@ -13,10 +13,15 @@ */ package org.eclipse.cdt.core.parser.tests.ast2; +import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; +import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; +import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; +import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IParameter; @@ -43,6 +48,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.parser.ParserLanguage; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; /** * @author aniefer @@ -1525,4 +1531,26 @@ public class AST2TemplateTests extends AST2BaseTest { ICPPClassType A3 = (ICPPClassType) col.getName(11).resolveBinding(); assertSame( A2, A3 ); } + + public void testBug74204() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("template class A { \n"); //$NON-NLS-1$ + buffer.append(" A* p; \n"); //$NON-NLS-1$ + buffer.append(" void f() { this; } \n"); //$NON-NLS-1$ + buffer.append("}; \n"); //$NON-NLS-1$ + + IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP ); + CPPNameCollector col = new CPPNameCollector(); + tu.accept( col ); + + IField p = (IField) col.getName(5).resolveBinding(); + + IASTName f = col.getName(6); + IASTFunctionDefinition fdef = (IASTFunctionDefinition) f.getParent().getParent(); + IASTExpressionStatement statement = (IASTExpressionStatement) ((IASTCompoundStatement)fdef.getBody()).getStatements()[0]; + IType type = CPPVisitor.getExpressionType( statement.getExpression() ); + + assertTrue( type.isSameType( p.getType() ) ); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index 1954164303a..5ffeea89386 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -104,6 +104,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; 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.ICPPDelegate; @@ -1544,6 +1545,9 @@ public class CPPVisitor { if( s instanceof ICPPClassScope ){ ICPPClassScope cScope = (ICPPClassScope) s; IType type = cScope.getClassType(); + if( type instanceof ICPPClassTemplate ){ + type = (IType) CPPTemplates.instantiateWithinClassTemplate( (ICPPClassTemplate) type ); + } if( dtor.isConst() || dtor.isVolatile() ) type = new CPPQualifierType(type, dtor.isConst(), dtor.isVolatile() ); type = new CPPPointerType( type );