@@ -155,22 +155,41 @@ private static void TryMoveExternalSpecializations(Class template)
155155 {
156156 continue ;
157157 }
158- var modules = ( from arg in specialization . Arguments
159- where arg . Type . Type != null
160- && ASTUtils . IsTypeExternal (
161- template . TranslationUnit . Module , arg . Type . Type )
162- let module = arg . Type . Type . GetModule ( )
163- where module != null
164- select module ) . ToList ( ) . TopologicalSort ( m => m . Dependencies ) ;
165- if ( modules . Count > 0 )
158+ Module module = GetExternalModule ( specialization ) ;
159+ if ( module != null )
166160 {
167- var module = modules . Last ( ) ;
168161 module . ExternalClassTemplateSpecializations . Add ( specialization ) ;
169162 template . Specializations . RemoveAt ( i ) ;
170163 }
171164 }
172165 }
173166
167+ private static Module GetExternalModule ( ClassTemplateSpecialization specialization )
168+ {
169+ Module currentModule = specialization . TemplatedDecl . TemplatedClass . TranslationUnit . Module ;
170+ List < Module > modules = new List < Module > ( ) ;
171+ foreach ( TemplateArgument arg in specialization . Arguments . Where ( arg => arg . Type . Type != null ) )
172+ {
173+ if ( ASTUtils . IsTypeExternal ( currentModule , arg . Type . Type ) )
174+ {
175+ Module module = arg . Type . Type . GetModule ( ) ;
176+ if ( module != null )
177+ {
178+ modules . Add ( module ) ;
179+ }
180+ }
181+ if ( arg . Type . Type . TryGetDeclaration ( out ClassTemplateSpecialization nestedSpecialization ) )
182+ {
183+ Module module = GetExternalModule ( nestedSpecialization ) ;
184+ if ( module != null )
185+ {
186+ modules . Add ( module ) ;
187+ }
188+ }
189+ }
190+ return modules . TopologicalSort ( m => m . Dependencies ) . LastOrDefault ( ) ;
191+ }
192+
174193 private void CheckForInternalSpecialization ( Declaration container , AST . Type type )
175194 {
176195 ASTUtils . CheckTypeForSpecialization ( type , container ,
0 commit comments