mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 14:42: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:
parent
17b4ad3d67
commit
df76958d18
3 changed files with 25 additions and 8 deletions
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue