string mangleTemplateToString (const string& templ_name, const SgTemplateArgumentPtrList& templ_args, const SgScopeStatement* scope) { // Mangle all the template arguments string args_mangled; // if (templ_args.begin() != templ_args.end()) if (templ_args.empty() == true) { args_mangled = "unknown_arg"; } else { args_mangled = mangleTemplateArgsToString(templ_args.begin(),templ_args.end()); } // Compute the name qualification, if any. string scope_name; if (scope == NULL) { scope_name = "unknown_scope"; } else { scope_name = mangleQualifiersToString (scope); } // Compute the final mangled name. string mangled_name = joinMangledQualifiersToString (scope_name, templ_name); // printf ("joinMangledQualifiersToString (scope_name, templ_name) : mangled_name = %s \n",mangled_name.c_str()); if (mangled_name.empty() == true) { mangled_name = "unknown_template_name"; } mangled_name += "__tas__" + args_mangled + "__tae__"; // printf ("args_mangled = %s mangled_name = %s \n",args_mangled.c_str(),mangled_name.c_str()); return mangled_name; }
bool FixupTemplateArguments::contains_private_type ( SgTemplateArgumentPtrList & templateArgList, SgScopeStatement* targetScope ) { bool returnValue = false; // ROSE_ASSERT(templateArgList.empty() == false); static std::set<SgTemplateArgumentPtrList> templateArgumentListSet; // DQ (2/15/2017): Make a copy of the vector and use that as a basis for identifing if the list has been previously processed. // SgTemplateArgumentPtrList templateArgList = templateArgList; // ROSE_ASSERT(templateArgList.empty() == false); if (templateArgumentListSet.find(templateArgList) == templateArgumentListSet.end()) { templateArgumentListSet.insert(templateArgList); } else { // #if DEBUGGING_USING_RECURSIVE_DEPTH #if 0 printf ("################# Already been or being processed: templateArgumentListSet.size() = %zu \n",templateArgumentListSet.size()); #endif #if 0 printf ("Leaving contains_private_type(SgTemplateArgumentPtrList): templateArgumentListSet.size() = %zu returning FALSE \n",templateArgumentListSet.size()); #endif // DQ (2/15/2017): Unclear if this is the correct return value, it might be that we want to record // the associated value from the first time the argument list was processed and use that value. // Then again, if the value had already been substituted into the template argument then no further // processing is required. return false; } int counter = 0; SgTemplateArgumentPtrList::const_iterator i = templateArgList.begin(); while (returnValue == false && i != templateArgList.end()) { #if 0 #if DEBUGGING_USING_RECURSIVE_DEPTH printf ("In contains_private_type(SgTemplateArgumentPtrList): global_depth = %zu Evaluating template argument # %d = %p = %s \n", global_depth,counter,*i,(*i)->class_name().c_str()); #else printf ("In contains_private_type(SgTemplateArgumentPtrList): Evaluating template argument # %d = %p = %s \n",counter,*i,(*i)->class_name().c_str()); #endif #endif returnValue |= contains_private_type(*i,targetScope); #if 0 #if DEBUGGING_USING_RECURSIVE_DEPTH printf ("In contains_private_type(SgTemplateArgumentPtrList): global_depth = %zu template argument # %d = %p = %s returnValue = %s \n", global_depth,counter,*i,(*i)->class_name().c_str(),returnValue ? "true" : "false"); #else printf ("In contains_private_type(SgTemplateArgumentPtrList): template argument # %d = %p = %s returnValue = %s \n", counter,*i,(*i)->class_name().c_str(),returnValue ? "true" : "false"); #endif #endif i++; counter++; } #if DEBUG_PRIVATE_TYPE || 0 printf ("Leaving contains_private_type(SgTemplateArgumentPtrList): templateArgumentListSet.size() = %zu returnValue = %s \n",templateArgumentListSet.size(),returnValue ? "true" : "false"); #endif return returnValue; }