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>
* 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);
}
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;
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;
}
public static IType getFieldOwnerType(IType fieldOwnerExpressionType, boolean isDeref, IASTNode point, Collection<ICPPFunction> functionBindings,
- boolean returnUnnamed) {
+ boolean returnDependent) {
IType type= fieldOwnerExpressionType;
if (!isDeref)
return type;
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;
}