1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Bug 472436 - Dependent field reference with pointer as field owner

Change-Id: I28ed13ac473249fe79800ae1a2361f87bacc156d
Signed-off-by: Nathan Ridge <zeratul976@hotmail.com>
This commit is contained in:
Nathan Ridge 2015-07-12 21:10:11 -04:00 committed by Gerrit Code Review @ Eclipse.org
parent 17b4ad3d67
commit df76958d18
3 changed files with 25 additions and 8 deletions

View file

@ -7997,6 +7997,22 @@ public class AST2TemplateTests extends AST2TestBase {
parseAndCheckBindings();
}
// struct S {
// int foo;
// };
//
// template <typename T>
// auto bar(T t) -> decltype(t->foo);
//
// int main() {
// S s;
// auto waldo = bar(&s);
// }
public void testDependentFieldReference_472436() throws Exception {
BindingAssertionHelper helper = getAssertionHelper();
helper.assertVariableType("waldo", CommonCPPTypes.int_);
}
// template <typename>
// struct Bind {};
// template <typename Func, typename ... BoundArgs>

View file

@ -30,10 +30,6 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils;
* Represents a C++ class, declaration of which is not yet available.
*/
public class CPPUnknownMemberClass extends CPPUnknownMember implements ICPPUnknownMemberClass {
public static CPPUnknownMemberClass createUnnamedInstance() {
return new CPPUnknownMemberClass(null, CharArrayUtils.EMPTY);
}
public CPPUnknownMemberClass(IType owner, char[] name) {
super(owner, name);
}

View file

@ -27,6 +27,7 @@ import java.util.Collection;
import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IFunction;
@ -46,7 +47,6 @@ import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer;
import org.eclipse.cdt.internal.core.dom.parser.ProblemType;
import org.eclipse.cdt.internal.core.dom.parser.Value;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownMemberClass;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
@ -166,7 +166,7 @@ public class EvalMemberAccess extends CPPDependentEvaluation {
}
public static IType getFieldOwnerType(IType fieldOwnerExpressionType, boolean isDeref, IASTNode point, Collection<ICPPFunction> functionBindings,
boolean returnUnnamed) {
boolean returnDependent) {
IType type= fieldOwnerExpressionType;
if (!isDeref)
return type;
@ -208,8 +208,13 @@ public class EvalMemberAccess extends CPPDependentEvaluation {
return glvalueType(((IPointerType) prValue).getType());
}
if (CPPTemplates.isDependentType(type))
return returnUnnamed ? CPPUnknownMemberClass.createUnnamedInstance() : null;
if (CPPTemplates.isDependentType(type)) {
return returnDependent
// The type resulting from dereferecing 'type'
? new TypeOfDependentExpression(new EvalUnary(IASTUnaryExpression.op_star,
new EvalFixed(type, LVALUE, Value.UNKNOWN), null, point))
: null;
}
return ProblemType.UNKNOWN_FOR_EXPRESSION;
}