<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>