mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 09:46:02 +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:
parent
17b4ad3d67
commit
df76958d18
3 changed files with 25 additions and 8 deletions
|
@ -7997,6 +7997,22 @@ public class AST2TemplateTests extends AST2TestBase {
|
||||||
parseAndCheckBindings();
|
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>
|
// template <typename>
|
||||||
// struct Bind {};
|
// struct Bind {};
|
||||||
// template <typename Func, typename ... BoundArgs>
|
// template <typename Func, typename ... BoundArgs>
|
||||||
|
|
|
@ -30,10 +30,6 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||||
* Represents a C++ class, declaration of which is not yet available.
|
* Represents a C++ class, declaration of which is not yet available.
|
||||||
*/
|
*/
|
||||||
public class CPPUnknownMemberClass extends CPPUnknownMember implements ICPPUnknownMemberClass {
|
public class CPPUnknownMemberClass extends CPPUnknownMember implements ICPPUnknownMemberClass {
|
||||||
public static CPPUnknownMemberClass createUnnamedInstance() {
|
|
||||||
return new CPPUnknownMemberClass(null, CharArrayUtils.EMPTY);
|
|
||||||
}
|
|
||||||
|
|
||||||
public CPPUnknownMemberClass(IType owner, char[] name) {
|
public CPPUnknownMemberClass(IType owner, char[] name) {
|
||||||
super(owner, name);
|
super(owner, name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ import java.util.Collection;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory;
|
import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
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.IBinding;
|
||||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
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.ITypeMarshalBuffer;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.ProblemType;
|
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.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.ICPPEvaluation;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
|
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,
|
public static IType getFieldOwnerType(IType fieldOwnerExpressionType, boolean isDeref, IASTNode point, Collection<ICPPFunction> functionBindings,
|
||||||
boolean returnUnnamed) {
|
boolean returnDependent) {
|
||||||
IType type= fieldOwnerExpressionType;
|
IType type= fieldOwnerExpressionType;
|
||||||
if (!isDeref)
|
if (!isDeref)
|
||||||
return type;
|
return type;
|
||||||
|
@ -208,8 +208,13 @@ public class EvalMemberAccess extends CPPDependentEvaluation {
|
||||||
return glvalueType(((IPointerType) prValue).getType());
|
return glvalueType(((IPointerType) prValue).getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CPPTemplates.isDependentType(type))
|
if (CPPTemplates.isDependentType(type)) {
|
||||||
return returnUnnamed ? CPPUnknownMemberClass.createUnnamedInstance() : null;
|
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;
|
return ProblemType.UNKNOWN_FOR_EXPRESSION;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue