Don't invent a '$auto-x-y' name for auto types in generic lambdas. This is no

better than the 'template-parameter-x-y' name that we'd get in AST printing,
and is worse in several ways (it's harder to distinguish it from a
user-supplied name, it's wrong after substituting some number of outer
levels, it wastes time and space constructing an IdentifierInfo, ...).

llvm-svn: 225489
This commit is contained in:
Richard Smith 2015-01-09 00:59:40 +00:00
parent 94a9ae776d
commit b5d1a73988
2 changed files with 2 additions and 11 deletions

View File

@ -1007,16 +1007,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
const unsigned TemplateParameterDepth = LSI->AutoTemplateParameterDepth;
const unsigned AutoParameterPosition = LSI->AutoTemplateParams.size();
const bool IsParameterPack = declarator.hasEllipsis();
// Create a name for the invented template parameter type.
std::string InventedTemplateParamName = "$auto-";
llvm::raw_string_ostream ss(InventedTemplateParamName);
ss << TemplateParameterDepth;
ss << "-" << AutoParameterPosition;
ss.flush();
IdentifierInfo& TemplateParamII = Context.Idents.get(
InventedTemplateParamName.c_str());
// Turns out we must create the TemplateTypeParmDecl here to
// retrieve the corresponding template parameter type.
TemplateTypeParmDecl *CorrespondingTemplateParam =
@ -1031,7 +1022,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) {
/*NameLoc*/ declarator.getLocStart(),
TemplateParameterDepth,
AutoParameterPosition, // our template param index
/* Identifier*/ &TemplateParamII, false, IsParameterPack);
/* Identifier*/ nullptr, false, IsParameterPack);
LSI->AutoTemplateParams.push_back(CorrespondingTemplateParam);
// Replace the 'auto' in the function parameter with this invented
// template type parameter.

View File

@ -50,7 +50,7 @@ int add(int x, int y) {
}
// CHECK-PRINT: inline int add_int_slowly_twice
// CHECK-PRINT: lambda = [] ($auto-0-0 z
// CHECK-PRINT: lambda = [] (type-parameter-0-0 z
// CHECK-PRINT: init_capture
// CHECK-PRINT: [&, x( t )]