From 5965feb28859be9fa27cc7515584ed7abdd35228 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 19 May 2008 13:22:07 +0000 Subject: [PATCH] Provide correct argMap to deferred class instantiations. --- .../cpp/CPPClassTemplatePartialSpecialization.java | 11 ++++++----- .../core/dom/parser/cpp/semantics/CPPTemplates.java | 4 ++-- .../PDOMCPPClassTemplatePartialSpecialization.java | 13 +++++++------ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java index accfc1355a9..ff1d2475dbf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java @@ -71,17 +71,14 @@ public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate impl return null; } + boolean argsContainDependentType= false; ObjectMap argMap = new ObjectMap( specArgs.length ); int numSpecArgs = specArgs.length; for( int i = 0; i < numSpecArgs; i++ ){ IType spec = specArgs[i]; IType arg = args[i]; - //If the argument is a template parameter, we can't instantiate yet, defer for later - if( CPPTemplates.isDependentType( arg ) ){ - // mstodo the argmap may be partially filled - return deferredInstance( argMap, args ); - } + argsContainDependentType= argsContainDependentType || CPPTemplates.isDependentType(arg); try { if( !CPPTemplates.deduceTemplateArgument( argMap, spec, arg ) ) return null; @@ -90,6 +87,10 @@ public class CPPClassTemplatePartialSpecialization extends CPPClassTemplate impl } } + if (argsContainDependentType) { + return deferredInstance( argMap, args ); + } + ICPPTemplateParameter [] params = getTemplateParameters(); int numParams = params.length; for( int i = 0; i < numParams; i++ ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index 89fc3749fc1..05c62e9dd1d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -1875,9 +1875,9 @@ public class CPPTemplates { result = bindings[0]; } } - if (unknown instanceof ICPPUnknownClassInstance && result instanceof ICPPTemplateDefinition) { + if (unknown instanceof ICPPUnknownClassInstance && result instanceof ICPPInternalTemplateInstantiator) { IType[] newArgs = CPPTemplates.instantiateTypes(((ICPPUnknownClassInstance) unknown).getArguments(), argMap, null); - result = CPPTemplates.instantiateTemplate((ICPPTemplateDefinition) result, newArgs, null); + result = ((ICPPInternalTemplateInstantiator) result).instantiate(newArgs); } } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java index 64880645ff3..5edf7157513 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java @@ -181,17 +181,14 @@ class PDOMCPPClassTemplatePartialSpecialization extends return null; } + boolean argsContainDependentType= false; ObjectMap argMap = new ObjectMap( specArgs.length ); int numSpecArgs = specArgs.length; for( int i = 0; i < numSpecArgs; i++ ){ IType spec = specArgs[i]; IType arg = args[i]; - //If the argument is a template parameter, we can't instantiate yet, defer for later - if( CPPTemplates.isDependentType( arg ) ){ - // mstodo argMap may be partially initialized. - return deferredInstance( argMap, args ); - } + argsContainDependentType= argsContainDependentType || CPPTemplates.isDependentType(arg); try { if( !CPPTemplates.deduceTemplateArgument( argMap, spec, arg ) ) return null; @@ -199,7 +196,11 @@ class PDOMCPPClassTemplatePartialSpecialization extends return null; } } - + + if (argsContainDependentType) { + return deferredInstance( argMap, args ); + } + ICPPTemplateParameter [] params = getTemplateParameters(); int numParams = params.length; for( int i = 0; i < numParams; i++ ){