From ff7406087ea0bb244e8d56e6cebc53d06cf07b0c Mon Sep 17 00:00:00 2001
From: Markus Schorn <markus.schorn@windriver.com>
Date: Tue, 12 Jun 2007 13:28:18 +0000
Subject: [PATCH] Fix for 192182, ClassCastException in template instanciation.

---
 .../core/dom/parser/cpp/CPPClassTemplate.java   | 17 ++++++++++++-----
 .../dom/parser/cpp/CPPFunctionTemplate.java     | 11 +++++++----
 .../core/dom/parser/cpp/CPPTemplates.java       |  4 ++--
 3 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java
index 5c9b574b544..bc3c34e54e5 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java
@@ -8,6 +8,7 @@
  * Contributors:
  * IBM - Initial API and implementation
  * Bryan Wilkinson (QNX)
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Mar 31, 2005
@@ -72,19 +73,25 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements
             return ((ICPPClassTemplate)getBinding()).getTemplateParameters();
         }
         public void addSpecialization( IType[] arguments, ICPPSpecialization specialization ) {
-            ((ICPPInternalTemplate)getBinding()).addSpecialization( arguments, specialization );
+            final IBinding binding = getBinding();
+            if (binding instanceof ICPPInternalBinding) {
+            	((ICPPInternalTemplate)binding).addSpecialization( arguments, specialization );
+            }
         }
         public IBinding instantiate( IType[] arguments ) {
-            return ((ICPPInternalTemplate)getBinding()).instantiate( arguments );
+            return ((ICPPInternalTemplateInstantiator)getBinding()).instantiate( arguments );
         }
         public ICPPSpecialization deferredInstance( IType[] arguments ) {
-            return ((ICPPInternalTemplate)getBinding()).deferredInstance( arguments );
+            return ((ICPPInternalTemplateInstantiator)getBinding()).deferredInstance( arguments );
         }
         public ICPPSpecialization getInstance( IType[] arguments ) {
-            return ((ICPPInternalTemplate)getBinding()).getInstance( arguments );
+            return ((ICPPInternalTemplateInstantiator)getBinding()).getInstance( arguments );
         }
 		public void addPartialSpecialization( ICPPClassTemplatePartialSpecialization spec ) {
-			((ICPPInternalClassTemplate)getBinding()).addPartialSpecialization( spec );
+            final IBinding binding = getBinding();
+            if (binding instanceof ICPPInternalClassTemplate) {
+            	((ICPPInternalClassTemplate)getBinding()).addPartialSpecialization( spec );
+            }
 		}
     }
 	private ICPPClassTemplatePartialSpecialization [] partialSpecializations = null;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java
index 83a6198d480..13fbdb746c0 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionTemplate.java
@@ -100,16 +100,19 @@ public class CPPFunctionTemplate extends CPPTemplateDefinition implements ICPPFu
             return ((ICPPFunctionTemplate)getBinding()).getTemplateParameters();
         }
         public void addSpecialization( IType[] arguments, ICPPSpecialization specialization ) {
-            ((ICPPInternalTemplate)getBinding()).addSpecialization( arguments, specialization );
+            final IBinding binding = getBinding();
+            if (binding instanceof ICPPInternalBinding) {
+            	((ICPPInternalTemplate)getBinding()).addSpecialization( arguments, specialization );
+            }
         }
         public IBinding instantiate( IType[] arguments ) {
-            return ((ICPPInternalTemplate)getBinding()).instantiate( arguments );
+            return ((ICPPInternalTemplateInstantiator)getBinding()).instantiate( arguments );
         }
         public ICPPSpecialization deferredInstance( IType[] arguments ) {
-            return ((ICPPInternalTemplate)getBinding()).deferredInstance( arguments );
+            return ((ICPPInternalTemplateInstantiator)getBinding()).deferredInstance( arguments );
         }
         public ICPPSpecialization getInstance( IType[] arguments ) {
-            return ((ICPPInternalTemplate)getBinding()).getInstance( arguments );
+            return ((ICPPInternalTemplateInstantiator)getBinding()).getInstance( arguments );
         }
     }
 	
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java
index 11d1f29a994..c307c5784bb 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java
@@ -1542,8 +1542,8 @@ public class CPPTemplates {
 			}
 		}
 		
-		if( template instanceof ICPPInternalTemplate ){
-			return ((ICPPInternalTemplate)template).instantiate( args );
+		if( template instanceof ICPPInternalTemplateInstantiator ){
+			return ((ICPPInternalTemplateInstantiator)template).instantiate( args );
 		}
 		return template;
 	}