Bug 472436 - Dependent field reference with pointer as field owner
authorNathan Ridge <zeratul976@hotmail.com>
Mon, 13 Jul 2015 01:10:11 +0000 (21:10 -0400)
committerGerrit Code Review @ Eclipse.org <gerrit@eclipse.org>
Mon, 13 Jul 2015 19:37:25 +0000 (15:37 -0400)
Change-Id: I28ed13ac473249fe79800ae1a2361f87bacc156d
Signed-off-by: Nathan Ridge <zeratul976@hotmail.com>
core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java
core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownMemberClass.java
core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalMemberAccess.java

index 817297d..383cc4d 100644 (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>
index 5ed49c9..5dce68e 100644 (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);
     }
index c283369..c4bbf5e 100644 (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;
        }