<div dir="ltr"><div>This test should pass with r186718 now.<br></div><div><br></div><div>This test passed for me locally on Windows, probably due to delayed template parsing or something.  I built on Linux before committing but did not run the tests due to this longstanding build break:</div>
<div><a href="http://llvm.org/bugs/show_bug.cgi?id=13124#c15">http://llvm.org/bugs/show_bug.cgi?id=13124#c15</a>.</div><div><br></div><div>This is a new test, so it's not clear to me that this is a regression.  I have a patch that fixes a similar crash, and I need to test if it fixes this crash as well.</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jul 19, 2013 at 4:30 PM, David Dean <span dir="ltr"><<a href="mailto:david_dean@apple.com" target="_blank">david_dean@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Reid,<br>
        After this change, the compiler is crashing when running one of the tests on this bot:<br>
<a href="http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-nobootstrap-RAincremental/builds/4672" target="_blank">http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-nobootstrap-RAincremental/builds/4672</a><br>

<br>
******************** TEST 'Clang :: SemaTemplate/instantiate-function-params.cpp' FAILED ********************<br>
Script:<br>
--<br>
/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/clang -cc1 -internal-isystem /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/../lib/clang/3.4/include -fsyntax-only -verify /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang.src/test/SemaTemplate/instantiate-function-params.cpp<br>

--<br>
Exit Code: 139<br>
Command Output (stderr):<br>
--<br>
0  clang             0x0000000107bcd058 llvm::sys::PrintStackTrace(__sFILE*) + 40<br>
1  clang             0x0000000107bcd5a4 _ZL13SignalHandleri + 644<br>
2  libsystem_c.dylib 0x00007fff94461cfa _sigtramp + 26<br>
3  libsystem_c.dylib 0x00007fff9442a00e szone_malloc_should_clear + 1115<br>
4  clang             0x00000001067de96c clang::TemplateDeclInstantiator::SubstFunctionType(clang::FunctionDecl*, llvm::SmallVectorImpl<clang::ParmVarDecl*>&) + 236<br>
5  clang             0x00000001067dc0f7 clang::TemplateDeclInstantiator::VisitCXXMethodDecl(clang::CXXMethodDecl*, clang::TemplateParameterList*, bool) + 807<br>
6  clang             0x00000001067b87f5 clang::Sema::InstantiateClass(clang::SourceLocation, clang::CXXRecordDecl*, clang::CXXRecordDecl*, clang::MultiLevelTemplateArgumentList const&, clang::TemplateSpecializationKind, bool) + 1189<br>

7  clang             0x00000001067ba1a5 clang::Sema::InstantiateClassTemplateSpecialization(clang::SourceLocation, clang::ClassTemplateSpecializationDecl*, clang::TemplateSpecializationKind, bool) + 1749<br>
8  clang             0x0000000106809df8 clang::Sema::RequireCompleteTypeImpl(clang::SourceLocation, clang::QualType, clang::Sema::TypeDiagnoser&) + 968<br>
9  clang             0x0000000106809955 clang::Sema::RequireCompleteType(clang::SourceLocation, clang::QualType, clang::Sema::TypeDiagnoser&) + 21<br>
10 clang             0x00000001067fe385 clang::Sema::RequireCompleteType(clang::SourceLocation, clang::QualType, unsigned int) + 37<br>
11 clang             0x0000000106514b10 clang::Sema::CheckParmsForFunctionDef(clang::ParmVarDecl* const*, clang::ParmVarDecl* const*, bool) + 176<br>
12 clang             0x000000010658866c clang::Sema::ActOnStartOfFunctionDef(clang::Scope*, clang::Decl*) + 1580<br>
13 clang             0x00000001064af1f3 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&, clang::Parser::ParsedTemplateInfo const&, clang::Parser::LateParsedAttrList*) + 1715<br>
14 clang             0x0000000106442c17 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, unsigned int, bool, clang::SourceLocation*, clang::Parser::ForRangeInit*) + 1319<br>
15 clang             0x00000001064ae9c6 clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec&, clang::AccessSpecifier) + 646<br>
16 clang             0x00000001064ae417 clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*, clang::AccessSpecifier) + 359<br>
17 clang             0x00000001064ad847 clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) + 2615<br>
18 clang             0x00000001064534a8 clang::Parser::ParseInnerNamespace(std::vector<clang::SourceLocation, std::allocator<clang::SourceLocation> >&, std::vector<clang::IdentifierInfo*, std::allocator<clang::IdentifierInfo*> >&, std::vector<clang::SourceLocation, std::allocator<clang::SourceLocation> >&, unsigned int, clang::SourceLocation&, clang::ParsedAttributes&, clang::BalancedDelimiterTracker&) + 472<br>

19 clang             0x0000000106452a7c clang::Parser::ParseNamespace(unsigned int, clang::SourceLocation&, clang::SourceLocation) + 4332<br>
20 clang             0x000000010643f30c clang::Parser::ParseDeclaration(llvm::SmallVector<clang::Stmt*, 32u>&, unsigned int, clang::SourceLocation&, clang::Parser::ParsedAttributesWithRange&) + 428<br>
21 clang             0x00000001064ad3fd clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) + 1517<br>
22 clang             0x00000001064acd8e clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&) + 318<br>
23 clang             0x00000001064323d6 clang::ParseAST(clang::Sema&, bool, bool) + 438<br>
24 clang             0x000000010618d017 clang::FrontendAction::Execute() + 119<br>
25 clang             0x000000010616658d clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 973<br>
26 clang             0x000000010612d45f clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 3471<br>
27 clang             0x000000010612497a cc1_main(char const**, char const**, char const*, void*) + 826<br>
28 clang             0x000000010612b580 main + 9504<br>
29 clang             0x0000000106124634 start + 52<br>
30 clang             0x0000000000000007 start + 4193106439<br>
Stack dump:<br>
0.      Program arguments: /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/clang -cc1 -internal-isystem /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/../lib/clang/3.4/include -fsyntax-only -verify /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang.src/test/SemaTemplate/instantiate-function-params.cpp<br>

1.      /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang.src/test/SemaTemplate/instantiate-function-params.cpp:91:20: current parser token '{'<br>
2.      /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang.src/test/SemaTemplate/instantiate-function-params.cpp:80:1: parsing namespace 'InstantiateFunctionTypedef'<br>

/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/tools/clang/test/SemaTemplate/Output/instantiate-function-params.cpp.script: line 1: 14172 Segmentation fault: 11  /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/clang -cc1 -internal-isystem /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang-build/Release+Asserts/bin/../lib/clang/3.4/include -fsyntax-only -verify /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin11-nobootstrap-RAincremental/clang.src/test/SemaTemplate/instantiate-function-params.cpp<br>

--<br>
<br>
********************<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
On 19 Jul 2013, at 12:51 PM, Reid Kleckner <<a href="mailto:reid@kleckner.net">reid@kleckner.net</a>> wrote:<br>
<br>
> Author: rnk<br>
> Date: Fri Jul 19 14:51:03 2013<br>
> New Revision: 186714<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=186714&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=186714&view=rev</a><br>
> Log:<br>
> Create calling convention AttributedType sugar nodes<br>
><br>
> Canonical types are unchanged.  The type printer had to be changed to<br>
> avoid printing any non-default implicit calling convention as well as<br>
> the calling convention attribute.<br>
><br>
> Reviewers: rjmccall<br>
><br>
> Differential Revision: <a href="http://llvm-reviews.chandlerc.com/D1132" target="_blank">http://llvm-reviews.chandlerc.com/D1132</a><br>
><br>
> Modified:<br>
>    cfe/trunk/include/clang/AST/Type.h<br>
>    cfe/trunk/lib/AST/Type.cpp<br>
>    cfe/trunk/lib/AST/TypePrinter.cpp<br>
>    cfe/trunk/lib/Sema/SemaType.cpp<br>
>    cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp<br>
><br>
> Modified: cfe/trunk/include/clang/AST/Type.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=186714&r1=186713&r2=186714&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=186714&r1=186713&r2=186714&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/include/clang/AST/Type.h (original)<br>
> +++ cfe/trunk/include/clang/AST/Type.h Fri Jul 19 14:51:03 2013<br>
> @@ -3360,9 +3360,10 @@ public:<br>
>     attr_objc_gc,<br>
>     attr_objc_ownership,<br>
>     attr_pcs,<br>
> +    attr_pcs_vfp,<br>
><br>
>     FirstEnumOperandKind = attr_objc_gc,<br>
> -    LastEnumOperandKind = attr_pcs,<br>
> +    LastEnumOperandKind = attr_pcs_vfp,<br>
><br>
>     // No operand.<br>
>     attr_noreturn,<br>
> @@ -3406,16 +3407,9 @@ public:<br>
>   bool isSugared() const { return true; }<br>
>   QualType desugar() const { return getEquivalentType(); }<br>
><br>
> -  bool isMSTypeSpec() const {<br>
> -    switch (getAttrKind()) {<br>
> -    default:  return false;<br>
> -    case attr_ptr32:<br>
> -    case attr_ptr64:<br>
> -    case attr_sptr:<br>
> -    case attr_uptr:<br>
> -      return true;<br>
> -    }<br>
> -  }<br>
> +  bool isMSTypeSpec() const;<br>
> +<br>
> +  bool isCallingConv() const;<br>
><br>
>   void Profile(llvm::FoldingSetNodeID &ID) {<br>
>     Profile(ID, getAttrKind(), ModifiedType, EquivalentType);<br>
><br>
> Modified: cfe/trunk/lib/AST/Type.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=186714&r1=186713&r2=186714&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=186714&r1=186713&r2=186714&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/AST/Type.cpp (original)<br>
> +++ cfe/trunk/lib/AST/Type.cpp Fri Jul 19 14:51:03 2013<br>
> @@ -1842,6 +1842,47 @@ bool TagType::isBeingDefined() const {<br>
>   return getDecl()->isBeingDefined();<br>
> }<br>
><br>
> +bool AttributedType::isMSTypeSpec() const {<br>
> +  switch (getAttrKind()) {<br>
> +  default:  return false;<br>
> +  case attr_ptr32:<br>
> +  case attr_ptr64:<br>
> +  case attr_sptr:<br>
> +  case attr_uptr:<br>
> +    return true;<br>
> +  }<br>
> +  llvm_unreachable("invalid attr kind");<br>
> +}<br>
> +<br>
> +bool AttributedType::isCallingConv() const {<br>
> +  switch (getAttrKind()) {<br>
> +  case attr_ptr32:<br>
> +  case attr_ptr64:<br>
> +  case attr_sptr:<br>
> +  case attr_uptr:<br>
> +  case attr_address_space:<br>
> +  case attr_regparm:<br>
> +  case attr_vector_size:<br>
> +  case attr_neon_vector_type:<br>
> +  case attr_neon_polyvector_type:<br>
> +  case attr_objc_gc:<br>
> +  case attr_objc_ownership:<br>
> +  case attr_noreturn:<br>
> +      return false;<br>
> +  case attr_pcs:<br>
> +  case attr_pcs_vfp:<br>
> +  case attr_cdecl:<br>
> +  case attr_fastcall:<br>
> +  case attr_stdcall:<br>
> +  case attr_thiscall:<br>
> +  case attr_pascal:<br>
> +  case attr_pnaclcall:<br>
> +  case attr_inteloclbicc:<br>
> +    return true;<br>
> +  }<br>
> +  llvm_unreachable("invalid attr kind");<br>
> +}<br>
> +<br>
> CXXRecordDecl *InjectedClassNameType::getDecl() const {<br>
>   return cast<CXXRecordDecl>(getInterestingTagDecl(Decl));<br>
> }<br>
><br>
> Modified: cfe/trunk/lib/AST/TypePrinter.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TypePrinter.cpp?rev=186714&r1=186713&r2=186714&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TypePrinter.cpp?rev=186714&r1=186713&r2=186714&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/AST/TypePrinter.cpp (original)<br>
> +++ cfe/trunk/lib/AST/TypePrinter.cpp Fri Jul 19 14:51:03 2013<br>
> @@ -81,10 +81,11 @@ namespace {<br>
>   class TypePrinter {<br>
>     PrintingPolicy Policy;<br>
>     bool HasEmptyPlaceHolder;<br>
> +    bool InsideCCAttribute;<br>
><br>
>   public:<br>
>     explicit TypePrinter(const PrintingPolicy &Policy)<br>
> -      : Policy(Policy), HasEmptyPlaceHolder(false) { }<br>
> +      : Policy(Policy), HasEmptyPlaceHolder(false), InsideCCAttribute(false) { }<br>
><br>
>     void print(const Type *ty, Qualifiers qs, raw_ostream &OS,<br>
>                StringRef PlaceHolder);<br>
> @@ -630,36 +631,40 @@ void TypePrinter::printFunctionProtoAfte<br>
>   OS << ')';<br>
><br>
>   FunctionType::ExtInfo Info = T->getExtInfo();<br>
> -  switch(Info.getCC()) {<br>
> -  case CC_Default: break;<br>
> -  case CC_C:<br>
> -    OS << " __attribute__((cdecl))";<br>
> -    break;<br>
> -  case CC_X86StdCall:<br>
> -    OS << " __attribute__((stdcall))";<br>
> -    break;<br>
> -  case CC_X86FastCall:<br>
> -    OS << " __attribute__((fastcall))";<br>
> -    break;<br>
> -  case CC_X86ThisCall:<br>
> -    OS << " __attribute__((thiscall))";<br>
> -    break;<br>
> -  case CC_X86Pascal:<br>
> -    OS << " __attribute__((pascal))";<br>
> -    break;<br>
> -  case CC_AAPCS:<br>
> -    OS << " __attribute__((pcs(\"aapcs\")))";<br>
> -    break;<br>
> -  case CC_AAPCS_VFP:<br>
> -    OS << " __attribute__((pcs(\"aapcs-vfp\")))";<br>
> -    break;<br>
> -  case CC_PnaclCall:<br>
> -    OS << " __attribute__((pnaclcall))";<br>
> -    break;<br>
> -  case CC_IntelOclBicc:<br>
> -    OS << " __attribute__((intel_ocl_bicc))";<br>
> -    break;<br>
> +<br>
> +  if (!InsideCCAttribute) {<br>
> +    switch (Info.getCC()) {<br>
> +    case CC_Default: break;<br>
> +    case CC_C:<br>
> +      OS << " __attribute__((cdecl))";<br>
> +      break;<br>
> +    case CC_X86StdCall:<br>
> +      OS << " __attribute__((stdcall))";<br>
> +      break;<br>
> +    case CC_X86FastCall:<br>
> +      OS << " __attribute__((fastcall))";<br>
> +      break;<br>
> +    case CC_X86ThisCall:<br>
> +      OS << " __attribute__((thiscall))";<br>
> +      break;<br>
> +    case CC_X86Pascal:<br>
> +      OS << " __attribute__((pascal))";<br>
> +      break;<br>
> +    case CC_AAPCS:<br>
> +      OS << " __attribute__((pcs(\"aapcs\")))";<br>
> +      break;<br>
> +    case CC_AAPCS_VFP:<br>
> +      OS << " __attribute__((pcs(\"aapcs-vfp\")))";<br>
> +      break;<br>
> +    case CC_PnaclCall:<br>
> +      OS << " __attribute__((pnaclcall))";<br>
> +      break;<br>
> +    case CC_IntelOclBicc:<br>
> +      OS << " __attribute__((intel_ocl_bicc))";<br>
> +      break;<br>
> +    }<br>
>   }<br>
> +<br>
>   if (Info.getNoReturn())<br>
>     OS << " __attribute__((noreturn))";<br>
>   if (Info.getRegParm())<br>
> @@ -1089,7 +1094,7 @@ void TypePrinter::printAttributedBefore(<br>
>     case AttributedType::attr_ptr64: OS << " __ptr64"; break;<br>
>     case AttributedType::attr_sptr: OS << " __sptr"; break;<br>
>     case AttributedType::attr_uptr: OS << " __uptr"; break;<br>
> -}<br>
> +    }<br>
>     spaceBeforePlaceHolder(OS);<br>
>   }<br>
> }<br>
> @@ -1105,6 +1110,12 @@ void TypePrinter::printAttributedAfter(c<br>
>   if (T->isMSTypeSpec())<br>
>     return;<br>
><br>
> +  // If this is a calling convention attribute, don't print the implicit CC from<br>
> +  // the modified type.<br>
> +  SaveAndRestore<bool> MaybeSuppressCC(InsideCCAttribute, T->isCallingConv());<br>
> +<br>
> +  printAfter(T->getModifiedType(), OS);<br>
> +<br>
>   OS << " __attribute__((";<br>
>   switch (T->getAttrKind()) {<br>
>   default: llvm_unreachable("This attribute should have been handled already");<br>
><br>
> Modified: cfe/trunk/lib/Sema/SemaType.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=186714&r1=186713&r2=186714&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=186714&r1=186713&r2=186714&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)<br>
> +++ cfe/trunk/lib/Sema/SemaType.cpp Fri Jul 19 14:51:03 2013<br>
> @@ -546,12 +546,7 @@ distributeFunctionTypeAttrToInnermost(Ty<br>
>     return true;<br>
>   }<br>
><br>
> -  if (handleFunctionTypeAttr(state, attr, declSpecType)) {<br>
> -    spliceAttrOutOfList(attr, attrList);<br>
> -    return true;<br>
> -  }<br>
> -<br>
> -  return false;<br>
> +  return handleFunctionTypeAttr(state, attr, declSpecType);<br>
> }<br>
><br>
> /// A function type attribute was written in the decl spec.  Try to<br>
> @@ -3345,6 +3340,7 @@ static AttributeList::Kind getAttrListKi<br>
>   case AttributedType::attr_pascal:<br>
>     return AttributeList::AT_Pascal;<br>
>   case AttributedType::attr_pcs:<br>
> +  case AttributedType::attr_pcs_vfp:<br>
>     return AttributeList::AT_Pcs;<br>
>   case AttributedType::attr_pnaclcall:<br>
>     return AttributeList::AT_PnaclCall;<br>
> @@ -4302,6 +4298,36 @@ static bool handleMSPointerTypeQualifier<br>
>   return false;<br>
> }<br>
><br>
> +static AttributedType::Kind getCCTypeAttrKind(AttributeList &Attr) {<br>
> +  assert(!Attr.isInvalid());<br>
> +  switch (Attr.getKind()) {<br>
> +  default:<br>
> +    llvm_unreachable("not a calling convention attribute");<br>
> +  case AttributeList::AT_CDecl:<br>
> +    return AttributedType::attr_cdecl;<br>
> +  case AttributeList::AT_FastCall:<br>
> +    return AttributedType::attr_fastcall;<br>
> +  case AttributeList::AT_StdCall:<br>
> +    return AttributedType::attr_stdcall;<br>
> +  case AttributeList::AT_ThisCall:<br>
> +    return AttributedType::attr_thiscall;<br>
> +  case AttributeList::AT_Pascal:<br>
> +    return AttributedType::attr_pascal;<br>
> +  case AttributeList::AT_Pcs: {<br>
> +    // We know attr is valid so it can only have one of two strings args.<br>
> +    StringLiteral *Str = cast<StringLiteral>(Attr.getArg(0));<br>
> +    return llvm::StringSwitch<AttributedType::Kind>(Str->getString())<br>
> +        .Case("aapcs", AttributedType::attr_pcs)<br>
> +        .Case("aapcs-vfp", AttributedType::attr_pcs_vfp);<br>
> +  }<br>
> +  case AttributeList::AT_PnaclCall:<br>
> +    return AttributedType::attr_pnaclcall;<br>
> +  case AttributeList::AT_IntelOclBicc:<br>
> +    return AttributedType::attr_inteloclbicc;<br>
> +  }<br>
> +  llvm_unreachable("unexpected attribute kind!");<br>
> +}<br>
> +<br>
> /// Process an individual function attribute.  Returns true to<br>
> /// indicate that the attribute was handled, false if it wasn't.<br>
> static bool handleFunctionTypeAttr(TypeProcessingState &state,<br>
> @@ -4421,8 +4447,13 @@ static bool handleFunctionTypeAttr(TypeP<br>
>     }<br>
>   }<br>
><br>
> +  // Modify the CC from the wrapped function type, wrap it all back, and then<br>
> +  // wrap the whole thing in an AttributedType as written.  The modified type<br>
> +  // might have a different CC if we ignored the attribute.<br>
>   FunctionType::ExtInfo EI = unwrapped.get()->getExtInfo().withCallingConv(CC);<br>
> -  type = unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));<br>
> +  QualType Equivalent =<br>
> +      unwrapped.wrap(S, S.Context.adjustFunctionType(unwrapped.get(), EI));<br>
> +  type = S.Context.getAttributedType(getCCTypeAttrKind(attr), type, Equivalent);<br>
>   return true;<br>
> }<br>
><br>
><br>
> Modified: cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp?rev=186714&r1=186713&r2=186714&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp?rev=186714&r1=186713&r2=186714&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp (original)<br>
> +++ cfe/trunk/test/SemaTemplate/instantiate-function-params.cpp Fri Jul 19 14:51:03 2013<br>
> @@ -82,9 +82,15 @@ namespace InstantiateFunctionTypedef {<br>
>   struct X {<br>
>     typedef int functype(int, int);<br>
>     functype func;<br>
> +<br>
> +    typedef int stdfunctype(int, int) __attribute__((stdcall));<br>
> +    __attribute__((stdcall)) functype stdfunc1;<br>
> +    stdfunctype stdfunc2;<br>
>   };<br>
><br>
>   void f(X<int> x) {<br>
>     (void)x.func(1, 2);<br>
> +    (void)x.stdfunc1(1, 2);<br>
> +    (void)x.stdfunc2(1, 2);<br>
>   }<br>
> }<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">-David<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br></div>