r219977 - Re-commit r217995 and follow-up patches (r217997, r218011, r218053). These were
NAKAMURA Takumi
geek4civic at gmail.com
Fri Oct 17 06:08:57 PDT 2014
Excuse me, reverted in r220038.
With lit --vg,
******************** TEST 'Clang :: CXX/except/except.spec/p1.cpp'
FAILED ********************
Script:
--
/home/tnakamura/fio/ninja/1/./bin/clang -cc1 -internal-isystem
/fio/tnakamura/ninja/1/bin/../lib/clang/3.6.0/include -nostdsysteminc
-std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify
/fio/tnakamura/ninja/llvm-project/clang/test/CXX/except/except.spec/p1.cpp
--
Exit Code: 139
Command Output (stderr):
--
==9619== Invalid read of size 8
==9619== at 0x3897002: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::getSema() const
(TreeTransform.h:137)
==9619== by 0x389B957: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformExceptionSpec(clang::SourceLocation,
clang::FunctionProtoType::ExceptionSpecInfo&,
llvm::SmallVectorImpl<clang::QualType>&, bool&) (TreeTransform.h:4656)
==9619== by 0x3897056: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}::operator()(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&) const (TreeTransform.h:4566)
==9619== by 0x38B90BF: clang::QualType
clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType<clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}>(clang::TypeLocBuilder&, clang::FunctionProtoTypeLoc,
clang::CXXRecordDecl*, unsigned int, clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}) (TreeTransform.h:4620)
==9619== by 0x38A0A3B: clang::QualType (anonymous
namespace)::TemplateInstantiator::TransformFunctionProtoType<clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}>(clang::TypeLocBuilder&, clang::FunctionProtoTypeLoc,
clang::CXXRecordDecl*, unsigned int, clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}) (SemaTemplateInstantiate.cpp:1345)
==9619== by 0x3897105: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc) (TreeTransform.h:4566)
==9619== by 0x388F18E: (anonymous
namespace)::TemplateInstantiator::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc) (SemaTemplateInstantiate.cpp:796)
==9619== by 0x389AC8B: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc) (TypeNodes.def:79)
==9619== by 0x38AEED3: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformParenType(clang::TypeLocBuilder&,
clang::ParenTypeLoc) (TreeTransform.h:5370)
==9619== by 0x389ADDB: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc) (TypeNodes.def:82)
==9619== by 0x38ACDE5: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformPointerType(clang::TypeLocBuilder&,
clang::PointerTypeLoc) (TreeTransform.h:3895)
==9619== by 0x389A74B: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc) (TypeNodes.def:64)
==9619== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==9619==
#0 0x223c63e llvm::sys::PrintStackTrace(_IO_FILE*)
/home/tnakamura/fio/ninja/llvm-project/llvm/lib/Support/Unix/Signals.inc:423:0
#1 0x223c8e5 PrintStackTraceSignalHandler(void*)
/home/tnakamura/fio/ninja/llvm-project/llvm/lib/Support/Unix/Signals.inc:481:0
#2 0x223b42e SignalHandler(int)
/home/tnakamura/fio/ninja/llvm-project/llvm/lib/Support/Unix/Signals.inc:198:0
#3 0x8042710 __restore_rt (/lib64/libpthread.so.0+0xf710)
#4 0x3897002 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::getSema() const
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:137:0
#5 0x389b958 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformExceptionSpec(clang::SourceLocation,
clang::FunctionProtoType::ExceptionSpecInfo&,
llvm::SmallVectorImpl<clang::QualType>&, bool&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4656:0
#6 0x3897057 _ZZN5clang13TreeTransformIN12_GLOBAL__N_120TemplateInstantiatorEE26TransformFunctionProtoTypeERNS_14TypeLocBuilderENS_20FunctionProtoTypeLocEENKUlRNS_17FunctionProtoType17ExceptionSpecInfoERbE_clES9_SA_
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4566:0
#7 0x38b90c0 _ZN5clang13TreeTransformIN12_GLOBAL__N_120TemplateInstantiatorEE26TransformFunctionProtoTypeIZNS3_26TransformFunctionProtoTypeERNS_14TypeLocBuilderENS_20FunctionProtoTypeLocEEUlRNS_17FunctionProtoType17ExceptionSpecInfoERbE_EENS_8QualTypeES6_S7_PNS_13CXXRecordDeclEjT_
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4620:0
#8 0x38a0a3c _ZN12_GLOBAL__N_120TemplateInstantiator26TransformFunctionProtoTypeIZN5clang13TreeTransformIS0_E26TransformFunctionProtoTypeERNS2_14TypeLocBuilderENS2_20FunctionProtoTypeLocEEUlRNS2_17FunctionProtoType17ExceptionSpecInfoERbE_EENS2_8QualTypeES6_S7_PNS2_13CXXRecordDeclEjT_
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1345:0
#9 0x3897106 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4566:0
#10 0x388f18f (anonymous
namespace)::TemplateInstantiator::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:797:0
#11 0x389ac8c clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/include/clang/AST/TypeNodes.def:79:0
#12 0x38aeed4 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformParenType(clang::TypeLocBuilder&,
clang::ParenTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:5370:0
#13 0x389addc clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/include/clang/AST/TypeNodes.def:82:0
#14 0x38acde6 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformPointerType(clang::TypeLocBuilder&,
clang::PointerTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:3895:0
#15 0x389a74c clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/include/clang/AST/TypeNodes.def:64:0
#16 0x389a4c1 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeSourceInfo*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:3667:0
#17 0x3891b08 clang::Sema::SubstType(clang::TypeSourceInfo*,
clang::MultiLevelTemplateArgumentList const&, clang::SourceLocation,
clang::DeclarationName)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1496:0
#18 0x38cd909 clang::TemplateDeclInstantiator::VisitVarDecl(clang::VarDecl*,
bool) /home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:464:0
#19 0x38cd7f6 clang::TemplateDeclInstantiator::VisitVarDecl(clang::VarDecl*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:448:0
#20 0x389d4af clang::declvisitor::Base<clang::declvisitor::make_ptr,
clang::TemplateDeclInstantiator, clang::Decl*>::Visit(clang::Decl*)
/home/tnakamura/fio/ninja/1/tools/clang/include/clang/AST/DeclNodes.inc:391:0
#21 0x38d6ad7 clang::Sema::SubstDecl(clang::Decl*,
clang::DeclContext*, clang::MultiLevelTemplateArgumentList const&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:2665:0
#22 0x388f858 (anonymous
namespace)::TemplateInstantiator::TransformDefinition(clang::SourceLocation,
clang::Decl*) /home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:930:0
#23 0x38b417e clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformDeclStmt(clang::DeclStmt*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:6020:0
#24 0x389dc8a clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformStmt(clang::Stmt*)
/home/tnakamura/fio/ninja/1/tools/clang/include/clang/AST/StmtNodes.inc:91:0
#25 0x38bc776 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*,
bool) /home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:5583:0
#26 0x38b408a clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformCompoundStmt(clang::CompoundStmt*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:5571:0
#27 0x389dc34 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformStmt(clang::Stmt*)
/home/tnakamura/fio/ninja/1/tools/clang/include/clang/AST/StmtNodes.inc:79:0
#28 0x3895a8b clang::Sema::SubstStmt(clang::Stmt*,
clang::MultiLevelTemplateArgumentList const&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:2627:0
#29 0x38d93e1 clang::Sema::InstantiateFunctionDefinition(clang::SourceLocation,
clang::FunctionDecl*, bool, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:3422:0
#30 0x38dd047 clang::Sema::PerformPendingInstantiations(bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp:4591:0
#31 0x33ee329 clang::Sema::ActOnEndOfTranslationUnit()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/Sema.cpp:675:0
#32 0x31f4e39 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:549:0
#33 0x31ee338 clang::ParseAST(clang::Sema&, bool, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseAST.cpp:139:0
#34 0x2431f37 clang::ASTFrontendAction::ExecuteAction()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Frontend/FrontendAction.cpp:522:0
#35 0x2431a00 clang::FrontendAction::Execute()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Frontend/FrontendAction.cpp:427:0
#36 0x23f9744 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:812:0
#37 0x2546564 clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:222:0
#38 0x10ade45 cc1_main(llvm::ArrayRef<char const*>, char const*,
void*) /home/tnakamura/fio/ninja/llvm-project/clang/tools/driver/cc1_main.cpp:110:0
#39 0x10a6bd4 ExecuteCC1Tool(llvm::ArrayRef<char const*>,
llvm::StringRef)
/home/tnakamura/fio/ninja/llvm-project/clang/tools/driver/driver.cpp:364:0
#40 0x10a7224 main
/home/tnakamura/fio/ninja/llvm-project/clang/tools/driver/driver.cpp:410:0
#41 0x8a0ed5d __libc_start_main (/lib64/libc.so.6+0x1ed5d)
#42 0x10a39f9 _start (/fio/tnakamura/ninja/1/bin/clang-3.5+0x10a39f9)
Stack dump:
0. Program arguments: /home/tnakamura/fio/ninja/1/./bin/clang
-cc1 -internal-isystem
/fio/tnakamura/ninja/1/bin/../lib/clang/3.6.0/include -nostdsysteminc
-std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify
/fio/tnakamura/ninja/llvm-project/clang/test/CXX/except/except.spec/p1.cpp
1. <eof> parser at end of file
2. ==9619==
==9619== Process terminating with default action of signal 11 (SIGSEGV)
==9619== General Protection Fault
==9619== at 0x233CAAF:
ComputeLineNumbers(clang::DiagnosticsEngine&,
clang::SrcMgr::ContentCache*,
llvm::BumpPtrAllocatorImpl<llvm::MallocAllocator, 4096ul, 4096ul>&,
clang::SourceManager const&, bool&) (emmintrin.h:606)
==9619== by 0x233D0E0:
clang::SourceManager::getLineNumber(clang::FileID, unsigned int,
bool*) const (SourceManager.cpp:1307)
==9619== by 0x233D6E7:
clang::SourceManager::getPresumedLoc(clang::SourceLocation, bool)
const (SourceManager.cpp:1470)
==9619== by 0x233657C:
clang::SourceLocation::print(llvm::raw_ostream&, clang::SourceManager
const&) const (SourceLocation.cpp:45)
==9619== by 0x33F0788:
clang::PrettyDeclStackTraceEntry::print(llvm::raw_ostream&) const
(Sema.cpp:1235)
==9619== by 0x2202BE2: PrintStack(llvm::PrettyStackTraceEntry
const*, llvm::raw_ostream&) (PrettyStackTrace.cpp:40)
==9619== by 0x2202C56: PrintCurStackTrace(llvm::raw_ostream&)
(PrettyStackTrace.cpp:54)
==9619== by 0x2202C80: CrashHandler(void*) (PrettyStackTrace.cpp:79)
==9619== by 0x223B42D: SignalHandler(int) (Signals.inc:199)
==9619== by 0x804270F: ??? (in /lib64/libpthread-2.12.so)
==9619== by 0x3897001: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::getSema() const
(TreeTransform.h:137)
==9619== by 0x389B957: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformExceptionSpec(clang::SourceLocation,
clang::FunctionProtoType::ExceptionSpecInfo&,
llvm::SmallVectorImpl<clang::QualType>&, bool&) (TreeTransform.h:4656)
/fio/tnakamura/ninja/1/tools/clang/test/CXX/except/except.spec/Output/p1.cpp.script:
line 1: 9619 Segmentation fault
/home/tnakamura/fio/ninja/1/./bin/clang -cc1 -internal-isystem
/fio/tnakamura/ninja/1/bin/../lib/clang/3.6.0/include -nostdsysteminc
-std=c++11 -fexceptions -fcxx-exceptions -fsyntax-only -verify
/fio/tnakamura/ninja/llvm-project/clang/test/CXX/except/except.spec/p1.cpp
--
********************
FAIL: Clang :: SemaTemplate/instantiate-exception-spec.cpp (208 of 209)
******************** TEST 'Clang ::
SemaTemplate/instantiate-exception-spec.cpp' FAILED
********************
Script:
--
/home/tnakamura/fio/ninja/1/./bin/clang -cc1 -internal-isystem
/fio/tnakamura/ninja/1/bin/../lib/clang/3.6.0/include -nostdsysteminc
-fexceptions -fcxx-exceptions -verify
/fio/tnakamura/ninja/llvm-project/clang/test/SemaTemplate/instantiate-exception-spec.cpp
-DERRORS
/home/tnakamura/fio/ninja/1/./bin/clang -cc1 -internal-isystem
/fio/tnakamura/ninja/1/bin/../lib/clang/3.6.0/include -nostdsysteminc
-fexceptions -fcxx-exceptions -emit-llvm-only
/fio/tnakamura/ninja/llvm-project/clang/test/SemaTemplate/instantiate-exception-spec.cpp
--
Exit Code: 139
Command Output (stderr):
--
==9810== Invalid read of size 4
==9810== at 0x388EE1E: (anonymous
namespace)::TemplateInstantiator::getBaseLocation()
(SemaTemplateInstantiate.cpp:664)
==9810== by 0x3899DF5: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::QualType)
(TreeTransform.h:3644)
==9810== by 0x389BFAC: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformExceptionSpec(clang::SourceLocation,
clang::FunctionProtoType::ExceptionSpecInfo&,
llvm::SmallVectorImpl<clang::QualType>&, bool&) (TreeTransform.h:4734)
==9810== by 0x3897056: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}::operator()(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&) const (TreeTransform.h:4566)
==9810== by 0x38B90BF: clang::QualType
clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType<clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}>(clang::TypeLocBuilder&, clang::FunctionProtoTypeLoc,
clang::CXXRecordDecl*, unsigned int, clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}) (TreeTransform.h:4620)
==9810== by 0x38A0A3B: clang::QualType (anonymous
namespace)::TemplateInstantiator::TransformFunctionProtoType<clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}>(clang::TypeLocBuilder&, clang::FunctionProtoTypeLoc,
clang::CXXRecordDecl*, unsigned int, clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}) (SemaTemplateInstantiate.cpp:1345)
==9810== by 0x3897105: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc) (TreeTransform.h:4566)
==9810== by 0x388F18E: (anonymous
namespace)::TemplateInstantiator::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc) (SemaTemplateInstantiate.cpp:796)
==9810== by 0x389AC8B: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc) (TypeNodes.def:79)
==9810== by 0x38AEED3: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformParenType(clang::TypeLocBuilder&,
clang::ParenTypeLoc) (TreeTransform.h:5370)
==9810== by 0x389ADDB: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc) (TypeNodes.def:82)
==9810== by 0x38ACDE5: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformPointerType(clang::TypeLocBuilder&,
clang::PointerTypeLoc) (TreeTransform.h:3895)
==9810== Address 0x28 is not stack'd, malloc'd or (recently) free'd
==9810==
#0 0x223c63e llvm::sys::PrintStackTrace(_IO_FILE*)
/home/tnakamura/fio/ninja/llvm-project/llvm/lib/Support/Unix/Signals.inc:423:0
#1 0x223c8e5 PrintStackTraceSignalHandler(void*)
/home/tnakamura/fio/ninja/llvm-project/llvm/lib/Support/Unix/Signals.inc:481:0
#2 0x223b42e SignalHandler(int)
/home/tnakamura/fio/ninja/llvm-project/llvm/lib/Support/Unix/Signals.inc:198:0
#3 0x8042710 __restore_rt (/lib64/libpthread.so.0+0xf710)
#4 0x388ee1e (anonymous
namespace)::TemplateInstantiator::getBaseLocation()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:664:0
#5 0x3899df6 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::QualType)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:3644:0
#6 0x389bfad clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformExceptionSpec(clang::SourceLocation,
clang::FunctionProtoType::ExceptionSpecInfo&,
llvm::SmallVectorImpl<clang::QualType>&, bool&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4734:0
#7 0x3897057 _ZZN5clang13TreeTransformIN12_GLOBAL__N_120TemplateInstantiatorEE26TransformFunctionProtoTypeERNS_14TypeLocBuilderENS_20FunctionProtoTypeLocEENKUlRNS_17FunctionProtoType17ExceptionSpecInfoERbE_clES9_SA_
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4566:0
#8 0x38b90c0 _ZN5clang13TreeTransformIN12_GLOBAL__N_120TemplateInstantiatorEE26TransformFunctionProtoTypeIZNS3_26TransformFunctionProtoTypeERNS_14TypeLocBuilderENS_20FunctionProtoTypeLocEEUlRNS_17FunctionProtoType17ExceptionSpecInfoERbE_EENS_8QualTypeES6_S7_PNS_13CXXRecordDeclEjT_
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4620:0
#9 0x38a0a3c _ZN12_GLOBAL__N_120TemplateInstantiator26TransformFunctionProtoTypeIZN5clang13TreeTransformIS0_E26TransformFunctionProtoTypeERNS2_14TypeLocBuilderENS2_20FunctionProtoTypeLocEEUlRNS2_17FunctionProtoType17ExceptionSpecInfoERbE_EENS2_8QualTypeES6_S7_PNS2_13CXXRecordDeclEjT_
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1345:0
#10 0x3897106 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4566:0
#11 0x388f18f (anonymous
namespace)::TemplateInstantiator::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:797:0
#12 0x389ac8c clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/include/clang/AST/TypeNodes.def:79:0
#13 0x38aeed4 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformParenType(clang::TypeLocBuilder&,
clang::ParenTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:5370:0
#14 0x389addc clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/include/clang/AST/TypeNodes.def:82:0
#15 0x38acde6 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformPointerType(clang::TypeLocBuilder&,
clang::PointerTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:3895:0
#16 0x389a74c clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/include/clang/AST/TypeNodes.def:64:0
#17 0x389a4c1 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeSourceInfo*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:3667:0
#18 0x3891b08 clang::Sema::SubstType(clang::TypeSourceInfo*,
clang::MultiLevelTemplateArgumentList const&, clang::SourceLocation,
clang::DeclarationName)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1496:0
#19 0x389280d clang::Sema::SubstParmVarDecl(clang::ParmVarDecl*,
clang::MultiLevelTemplateArgumentList const&, int,
llvm::Optional<unsigned int>, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1680:0
#20 0x38912db (anonymous
namespace)::TemplateInstantiator::TransformFunctionTypeParam(clang::ParmVarDecl*,
int, llvm::Optional<unsigned int>, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1354:0
#21 0x389c89b clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionTypeParams(clang::SourceLocation,
clang::ParmVarDecl**, unsigned int, clang::QualType const*,
llvm::SmallVectorImpl<clang::QualType>&,
llvm::SmallVectorImpl<clang::ParmVarDecl*>*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4455:0
#22 0x3892be4 clang::Sema::SubstParmTypes(clang::SourceLocation,
clang::ParmVarDecl**, unsigned int,
clang::MultiLevelTemplateArgumentList const&,
llvm::SmallVectorImpl<clang::QualType>&,
llvm::SmallVectorImpl<clang::ParmVarDecl*>*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1751:0
#23 0x385483a clang::Sema::SubstituteExplicitTemplateArguments(clang::FunctionTemplateDecl*,
clang::TemplateArgumentListInfo&,
llvm::SmallVectorImpl<clang::DeducedTemplateArgument>&,
llvm::SmallVectorImpl<clang::QualType>&, clang::QualType*,
clang::sema::TemplateDeductionInfo&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:2632:0
#24 0x3856c44 clang::Sema::DeduceTemplateArguments(clang::FunctionTemplateDecl*,
clang::TemplateArgumentListInfo*, llvm::ArrayRef<clang::Expr*>,
clang::FunctionDecl*&, clang::sema::TemplateDeductionInfo&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:3337:0
#25 0x374461b clang::Sema::AddTemplateOverloadCandidate(clang::FunctionTemplateDecl*,
clang::DeclAccessPair, clang::TemplateArgumentListInfo*,
llvm::ArrayRef<clang::Expr*>, clang::OverloadCandidateSet&, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaOverload.cpp:6108:0
#26 0x3753f5a clang::AddOverloadedCallCandidate(clang::Sema&,
clang::DeclAccessPair, clang::TemplateArgumentListInfo*,
llvm::ArrayRef<clang::Expr*>, clang::OverloadCandidateSet&, bool,
bool) /home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaOverload.cpp:10353:0
#27 0x37541d6 clang::Sema::AddOverloadedCallCandidates(clang::UnresolvedLookupExpr*,
llvm::ArrayRef<clang::Expr*>, clang::OverloadCandidateSet&, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaOverload.cpp:10405:0
#28 0x375535a clang::Sema::buildOverloadedCallSet(clang::Scope*,
clang::Expr*, clang::UnresolvedLookupExpr*,
llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation,
clang::OverloadCandidateSet*, clang::ActionResult<clang::Expr*,
true>*) /home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaOverload.cpp:10677:0
#29 0x3755b9d clang::Sema::BuildOverloadedCallExpr(clang::Scope*,
clang::Expr*, clang::UnresolvedLookupExpr*, clang::SourceLocation,
llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation,
clang::Expr*, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaOverload.cpp:10788:0
#30 0x35d6d05 clang::Sema::ActOnCallExpr(clang::Scope*, clang::Expr*,
clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>,
clang::SourceLocation, clang::Expr*, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaExpr.cpp:4549:0
#31 0x3230e37 clang::Parser::ParsePostfixExpressionSuffix(clang::ActionResult<clang::Expr*,
true>) /home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseExpr.cpp:1426:0
#32 0x323032f clang::Parser::ParseCastExpression(bool, bool, bool&,
clang::Parser::TypeCastState)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseExpr.cpp:1251:0
#33 0x322cc9c clang::Parser::ParseCastExpression(bool, bool,
clang::Parser::TypeCastState)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseExpr.cpp:417:0
#34 0x322bd81 clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseExpr.cpp:169:0
#35 0x322bba8 clang::Parser::ParseExpression(clang::Parser::TypeCastState)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseExpr.cpp:121:0
#36 0x3261c17 clang::Parser::ParseExprStatement()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseStmt.cpp:384:0
#37 0x32614c8 clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*,
32u>&, bool, clang::SourceLocation*,
clang::Parser::ParsedAttributesWithRange&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseStmt.cpp:220:0
#38 0x3260d60 clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*,
32u>&, bool, clang::SourceLocation*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseStmt.cpp:107:0
#39 0x3263b65 clang::Parser::ParseCompoundStatementBody(bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseStmt.cpp:938:0
#40 0x3266e9e clang::Parser::ParseFunctionStatementBody(clang::Decl*,
clang::Parser::ParseScope&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseStmt.cpp:1857:0
#41 0x31f6f78 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&,
clang::Parser::ParsedTemplateInfo const&,
clang::Parser::LateParsedAttrList*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:1098:0
#42 0x3207290 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&,
unsigned int, bool, clang::SourceLocation*,
clang::Parser::ForRangeInit*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseDecl.cpp:1599:0
#43 0x31f61c8 clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec&, clang::AccessSpecifier)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:889:0
#44 0x31f62ac clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec*, clang::AccessSpecifier)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:904:0
#45 0x31f59e1 clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:762:0
#46 0x31f4ea8 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:559:0
#47 0x31ee338 clang::ParseAST(clang::Sema&, bool, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseAST.cpp:139:0
#48 0x2431f37 clang::ASTFrontendAction::ExecuteAction()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Frontend/FrontendAction.cpp:522:0
#49 0x2431a00 clang::FrontendAction::Execute()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Frontend/FrontendAction.cpp:427:0
#50 0x23f9744 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:812:0
#51 0x2546564 clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:222:0
#52 0x10ade45 cc1_main(llvm::ArrayRef<char const*>, char const*,
void*) /home/tnakamura/fio/ninja/llvm-project/clang/tools/driver/cc1_main.cpp:110:0
#53 0x10a6bd4 ExecuteCC1Tool(llvm::ArrayRef<char const*>,
llvm::StringRef)
/home/tnakamura/fio/ninja/llvm-project/clang/tools/driver/driver.cpp:364:0
#54 0x10a7224 main
/home/tnakamura/fio/ninja/llvm-project/clang/tools/driver/driver.cpp:410:0
#55 0x8a0ed5d __libc_start_main (/lib64/libc.so.6+0x1ed5d)
#56 0x10a39f9 _start (/fio/tnakamura/ninja/1/bin/clang-3.5+0x10a39f9)
Stack dump:
0. Program arguments: /home/tnakamura/fio/ninja/1/./bin/clang
-cc1 -internal-isystem
/fio/tnakamura/ninja/1/bin/../lib/clang/3.6.0/include -nostdsysteminc
-fexceptions -fcxx-exceptions -verify
/fio/tnakamura/ninja/llvm-project/clang/test/SemaTemplate/instantiate-exception-spec.cpp
-DERRORS
1. ==9810==
==9810== Process terminating with default action of signal 11 (SIGSEGV)
==9810== General Protection Fault
==9810== at 0x233CAAF:
ComputeLineNumbers(clang::DiagnosticsEngine&,
clang::SrcMgr::ContentCache*,
llvm::BumpPtrAllocatorImpl<llvm::MallocAllocator, 4096ul, 4096ul>&,
clang::SourceManager const&, bool&) (emmintrin.h:606)
==9810== by 0x233D0E0:
clang::SourceManager::getLineNumber(clang::FileID, unsigned int,
bool*) const (SourceManager.cpp:1307)
==9810== by 0x233D6E7:
clang::SourceManager::getPresumedLoc(clang::SourceLocation, bool)
const (SourceManager.cpp:1470)
==9810== by 0x233657C:
clang::SourceLocation::print(llvm::raw_ostream&, clang::SourceManager
const&) const (SourceLocation.cpp:45)
==9810== by 0x31EDF16: (anonymous
namespace)::PrettyStackTraceParserEntry::print(llvm::raw_ostream&)
const (ParseAST.cpp:57)
==9810== by 0x2202BE2: PrintStack(llvm::PrettyStackTraceEntry
const*, llvm::raw_ostream&) (PrettyStackTrace.cpp:40)
==9810== by 0x2202B90: PrintStack(llvm::PrettyStackTraceEntry
const*, llvm::raw_ostream&) (PrettyStackTrace.cpp:36)
==9810== by 0x2202B90: PrintStack(llvm::PrettyStackTraceEntry
const*, llvm::raw_ostream&) (PrettyStackTrace.cpp:36)
==9810== by 0x2202C56: PrintCurStackTrace(llvm::raw_ostream&)
(PrettyStackTrace.cpp:54)
==9810== by 0x2202C80: CrashHandler(void*) (PrettyStackTrace.cpp:79)
==9810== by 0x223B42D: SignalHandler(int) (Signals.inc:199)
==9810== by 0x804270F: ??? (in /lib64/libpthread-2.12.so)
/fio/tnakamura/ninja/1/tools/clang/test/SemaTemplate/Output/instantiate-exception-spec.cpp.script:
line 2: 9810 Segmentation fault
/home/tnakamura/fio/ninja/1/./bin/clang -cc1 -internal-isystem
/fio/tnakamura/ninja/1/bin/../lib/clang/3.6.0/include -nostdsysteminc
-fexceptions -fcxx-exceptions -verify
/fio/tnakamura/ninja/llvm-project/clang/test/SemaTemplate/instantiate-exception-spec.cpp
-DERRORS
--
********************
FAIL: Clang :: SemaTemplate/instantiate-exception-spec-cxx11.cpp (209 of 209)
******************** TEST 'Clang ::
SemaTemplate/instantiate-exception-spec-cxx11.cpp' FAILED
********************
Script:
--
/home/tnakamura/fio/ninja/1/./bin/clang -cc1 -internal-isystem
/fio/tnakamura/ninja/1/bin/../lib/clang/3.6.0/include -nostdsysteminc
-fsyntax-only -verify -triple x86_64-unknown-linux-gnu -std=c++11
-ftemplate-depth 16 -fcxx-exceptions -fexceptions
/fio/tnakamura/ninja/llvm-project/clang/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
--
Exit Code: 139
Command Output (stderr):
--
==9809== Invalid read of size 4
==9809== at 0x388EE1E: (anonymous
namespace)::TemplateInstantiator::getBaseLocation()
(SemaTemplateInstantiate.cpp:664)
==9809== by 0x3899DF5: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::QualType)
(TreeTransform.h:3644)
==9809== by 0x389BFAC: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformExceptionSpec(clang::SourceLocation,
clang::FunctionProtoType::ExceptionSpecInfo&,
llvm::SmallVectorImpl<clang::QualType>&, bool&) (TreeTransform.h:4734)
==9809== by 0x3897056: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}::operator()(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&) const (TreeTransform.h:4566)
==9809== by 0x38B90BF: clang::QualType
clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType<clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}>(clang::TypeLocBuilder&, clang::FunctionProtoTypeLoc,
clang::CXXRecordDecl*, unsigned int, clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}) (TreeTransform.h:4620)
==9809== by 0x38A0A3B: clang::QualType (anonymous
namespace)::TemplateInstantiator::TransformFunctionProtoType<clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}>(clang::TypeLocBuilder&, clang::FunctionProtoTypeLoc,
clang::CXXRecordDecl*, unsigned int, clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)::{lambda(clang::FunctionProtoType::ExceptionSpecInfo&,
bool&)#1}) (SemaTemplateInstantiate.cpp:1345)
==9809== by 0x3897105: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc) (TreeTransform.h:4566)
==9809== by 0x388F18E: (anonymous
namespace)::TemplateInstantiator::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc) (SemaTemplateInstantiate.cpp:796)
==9809== by 0x389AC8B: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc) (TypeNodes.def:79)
==9809== by 0x38AEED3: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformParenType(clang::TypeLocBuilder&,
clang::ParenTypeLoc) (TreeTransform.h:5370)
==9809== by 0x389ADDB: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc) (TypeNodes.def:82)
==9809== by 0x38ACDE5: clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformPointerType(clang::TypeLocBuilder&,
clang::PointerTypeLoc) (TreeTransform.h:3895)
==9809== Address 0x28 is not stack'd, malloc'd or (recently) free'd
==9809==
#0 0x223c63e llvm::sys::PrintStackTrace(_IO_FILE*)
/home/tnakamura/fio/ninja/llvm-project/llvm/lib/Support/Unix/Signals.inc:423:0
#1 0x223c8e5 PrintStackTraceSignalHandler(void*)
/home/tnakamura/fio/ninja/llvm-project/llvm/lib/Support/Unix/Signals.inc:481:0
#2 0x223b42e SignalHandler(int)
/home/tnakamura/fio/ninja/llvm-project/llvm/lib/Support/Unix/Signals.inc:198:0
#3 0x8042710 __restore_rt (/lib64/libpthread.so.0+0xf710)
#4 0x388ee1e (anonymous
namespace)::TemplateInstantiator::getBaseLocation()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:664:0
#5 0x3899df6 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::QualType)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:3644:0
#6 0x389bfad clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformExceptionSpec(clang::SourceLocation,
clang::FunctionProtoType::ExceptionSpecInfo&,
llvm::SmallVectorImpl<clang::QualType>&, bool&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4734:0
#7 0x3897057 _ZZN5clang13TreeTransformIN12_GLOBAL__N_120TemplateInstantiatorEE26TransformFunctionProtoTypeERNS_14TypeLocBuilderENS_20FunctionProtoTypeLocEENKUlRNS_17FunctionProtoType17ExceptionSpecInfoERbE_clES9_SA_
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4566:0
#8 0x38b90c0 _ZN5clang13TreeTransformIN12_GLOBAL__N_120TemplateInstantiatorEE26TransformFunctionProtoTypeIZNS3_26TransformFunctionProtoTypeERNS_14TypeLocBuilderENS_20FunctionProtoTypeLocEEUlRNS_17FunctionProtoType17ExceptionSpecInfoERbE_EENS_8QualTypeES6_S7_PNS_13CXXRecordDeclEjT_
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4620:0
#9 0x38a0a3c _ZN12_GLOBAL__N_120TemplateInstantiator26TransformFunctionProtoTypeIZN5clang13TreeTransformIS0_E26TransformFunctionProtoTypeERNS2_14TypeLocBuilderENS2_20FunctionProtoTypeLocEEUlRNS2_17FunctionProtoType17ExceptionSpecInfoERbE_EENS2_8QualTypeES6_S7_PNS2_13CXXRecordDeclEjT_
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1345:0
#10 0x3897106 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4566:0
#11 0x388f18f (anonymous
namespace)::TemplateInstantiator::TransformFunctionProtoType(clang::TypeLocBuilder&,
clang::FunctionProtoTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:797:0
#12 0x389ac8c clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/include/clang/AST/TypeNodes.def:79:0
#13 0x38aeed4 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformParenType(clang::TypeLocBuilder&,
clang::ParenTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:5370:0
#14 0x389addc clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/include/clang/AST/TypeNodes.def:82:0
#15 0x38acde6 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformPointerType(clang::TypeLocBuilder&,
clang::PointerTypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:3895:0
#16 0x389a74c clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformType(clang::TypeLocBuilder&,
clang::TypeLoc)
/home/tnakamura/fio/ninja/llvm-project/clang/include/clang/AST/TypeNodes.def:64:0
#17 0x3891d3f clang::Sema::SubstType(clang::TypeLoc,
clang::MultiLevelTemplateArgumentList const&, clang::SourceLocation,
clang::DeclarationName)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1522:0
#18 0x38926b0 clang::Sema::SubstParmVarDecl(clang::ParmVarDecl*,
clang::MultiLevelTemplateArgumentList const&, int,
llvm::Optional<unsigned int>, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1658:0
#19 0x38912db (anonymous
namespace)::TemplateInstantiator::TransformFunctionTypeParam(clang::ParmVarDecl*,
int, llvm::Optional<unsigned int>, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1354:0
#20 0x389c568 clang::TreeTransform<(anonymous
namespace)::TemplateInstantiator>::TransformFunctionTypeParams(clang::SourceLocation,
clang::ParmVarDecl**, unsigned int, clang::QualType const*,
llvm::SmallVectorImpl<clang::QualType>&,
llvm::SmallVectorImpl<clang::ParmVarDecl*>*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/TreeTransform.h:4411:0
#21 0x3892be4 clang::Sema::SubstParmTypes(clang::SourceLocation,
clang::ParmVarDecl**, unsigned int,
clang::MultiLevelTemplateArgumentList const&,
llvm::SmallVectorImpl<clang::QualType>&,
llvm::SmallVectorImpl<clang::ParmVarDecl*>*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateInstantiate.cpp:1751:0
#22 0x385483a clang::Sema::SubstituteExplicitTemplateArguments(clang::FunctionTemplateDecl*,
clang::TemplateArgumentListInfo&,
llvm::SmallVectorImpl<clang::DeducedTemplateArgument>&,
llvm::SmallVectorImpl<clang::QualType>&, clang::QualType*,
clang::sema::TemplateDeductionInfo&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:2632:0
#23 0x3856c44 clang::Sema::DeduceTemplateArguments(clang::FunctionTemplateDecl*,
clang::TemplateArgumentListInfo*, llvm::ArrayRef<clang::Expr*>,
clang::FunctionDecl*&, clang::sema::TemplateDeductionInfo&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:3337:0
#24 0x374461b clang::Sema::AddTemplateOverloadCandidate(clang::FunctionTemplateDecl*,
clang::DeclAccessPair, clang::TemplateArgumentListInfo*,
llvm::ArrayRef<clang::Expr*>, clang::OverloadCandidateSet&, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaOverload.cpp:6108:0
#25 0x3753f5a clang::AddOverloadedCallCandidate(clang::Sema&,
clang::DeclAccessPair, clang::TemplateArgumentListInfo*,
llvm::ArrayRef<clang::Expr*>, clang::OverloadCandidateSet&, bool,
bool) /home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaOverload.cpp:10353:0
#26 0x37541d6 clang::Sema::AddOverloadedCallCandidates(clang::UnresolvedLookupExpr*,
llvm::ArrayRef<clang::Expr*>, clang::OverloadCandidateSet&, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaOverload.cpp:10405:0
#27 0x375535a clang::Sema::buildOverloadedCallSet(clang::Scope*,
clang::Expr*, clang::UnresolvedLookupExpr*,
llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation,
clang::OverloadCandidateSet*, clang::ActionResult<clang::Expr*,
true>*) /home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaOverload.cpp:10677:0
#28 0x3755b9d clang::Sema::BuildOverloadedCallExpr(clang::Scope*,
clang::Expr*, clang::UnresolvedLookupExpr*, clang::SourceLocation,
llvm::MutableArrayRef<clang::Expr*>, clang::SourceLocation,
clang::Expr*, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaOverload.cpp:10788:0
#29 0x35d6d05 clang::Sema::ActOnCallExpr(clang::Scope*, clang::Expr*,
clang::SourceLocation, llvm::MutableArrayRef<clang::Expr*>,
clang::SourceLocation, clang::Expr*, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Sema/SemaExpr.cpp:4549:0
#30 0x3230e37 clang::Parser::ParsePostfixExpressionSuffix(clang::ActionResult<clang::Expr*,
true>) /home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseExpr.cpp:1426:0
#31 0x323032f clang::Parser::ParseCastExpression(bool, bool, bool&,
clang::Parser::TypeCastState)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseExpr.cpp:1251:0
#32 0x322cc9c clang::Parser::ParseCastExpression(bool, bool,
clang::Parser::TypeCastState)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseExpr.cpp:417:0
#33 0x322bd81 clang::Parser::ParseAssignmentExpression(clang::Parser::TypeCastState)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseExpr.cpp:169:0
#34 0x322bba8 clang::Parser::ParseExpression(clang::Parser::TypeCastState)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseExpr.cpp:121:0
#35 0x3261c17 clang::Parser::ParseExprStatement()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseStmt.cpp:384:0
#36 0x32614c8 clang::Parser::ParseStatementOrDeclarationAfterAttributes(llvm::SmallVector<clang::Stmt*,
32u>&, bool, clang::SourceLocation*,
clang::Parser::ParsedAttributesWithRange&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseStmt.cpp:220:0
#37 0x3260d60 clang::Parser::ParseStatementOrDeclaration(llvm::SmallVector<clang::Stmt*,
32u>&, bool, clang::SourceLocation*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseStmt.cpp:107:0
#38 0x3263b65 clang::Parser::ParseCompoundStatementBody(bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseStmt.cpp:938:0
#39 0x3266e9e clang::Parser::ParseFunctionStatementBody(clang::Decl*,
clang::Parser::ParseScope&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseStmt.cpp:1857:0
#40 0x31f6f78 clang::Parser::ParseFunctionDefinition(clang::ParsingDeclarator&,
clang::Parser::ParsedTemplateInfo const&,
clang::Parser::LateParsedAttrList*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:1098:0
#41 0x3207290 clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&,
unsigned int, bool, clang::SourceLocation*,
clang::Parser::ForRangeInit*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseDecl.cpp:1599:0
#42 0x31f61c8 clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec&, clang::AccessSpecifier)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:889:0
#43 0x31f62ac clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec*, clang::AccessSpecifier)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:904:0
#44 0x31f59e1 clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:762:0
#45 0x321b083 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&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseDeclCXX.cpp:210:0
#46 0x321aeeb clang::Parser::ParseNamespace(unsigned int,
clang::SourceLocation&, clang::SourceLocation)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseDeclCXX.cpp:189:0
#47 0x320677a clang::Parser::ParseDeclaration(llvm::SmallVector<clang::Stmt*,
32u>&, unsigned int, clang::SourceLocation&,
clang::Parser::ParsedAttributesWithRange&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseDecl.cpp:1340:0
#48 0x31f55db clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&,
clang::ParsingDeclSpec*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:701:0
#49 0x31f4ea8 clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/Parser.cpp:559:0
#50 0x31ee338 clang::ParseAST(clang::Sema&, bool, bool)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Parse/ParseAST.cpp:139:0
#51 0x2431f37 clang::ASTFrontendAction::ExecuteAction()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Frontend/FrontendAction.cpp:522:0
#52 0x2431a00 clang::FrontendAction::Execute()
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Frontend/FrontendAction.cpp:427:0
#53 0x23f9744 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/Frontend/CompilerInstance.cpp:812:0
#54 0x2546564 clang::ExecuteCompilerInvocation(clang::CompilerInstance*)
/home/tnakamura/fio/ninja/llvm-project/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:222:0
#55 0x10ade45 cc1_main(llvm::ArrayRef<char const*>, char const*,
void*) /home/tnakamura/fio/ninja/llvm-project/clang/tools/driver/cc1_main.cpp:110:0
#56 0x10a6bd4 ExecuteCC1Tool(llvm::ArrayRef<char const*>,
llvm::StringRef)
/home/tnakamura/fio/ninja/llvm-project/clang/tools/driver/driver.cpp:364:0
#57 0x10a7224 main
/home/tnakamura/fio/ninja/llvm-project/clang/tools/driver/driver.cpp:410:0
#58 0x8a0ed5d __libc_start_main (/lib64/libc.so.6+0x1ed5d)
#59 0x10a39f9 _start (/fio/tnakamura/ninja/1/bin/clang-3.5+0x10a39f9)
Stack dump:
0. Program arguments: /home/tnakamura/fio/ninja/1/./bin/clang
-cc1 -internal-isystem
/fio/tnakamura/ninja/1/bin/../lib/clang/3.6.0/include -nostdsysteminc
-fsyntax-only -verify -triple x86_64-unknown-linux-gnu -std=c++11
-ftemplate-depth 16 -fcxx-exceptions -fexceptions
/fio/tnakamura/ninja/llvm-project/clang/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
1. ==9809==
==9809== Process terminating with default action of signal 11 (SIGSEGV)
==9809== General Protection Fault
==9809== at 0x233CAAF:
ComputeLineNumbers(clang::DiagnosticsEngine&,
clang::SrcMgr::ContentCache*,
llvm::BumpPtrAllocatorImpl<llvm::MallocAllocator, 4096ul, 4096ul>&,
clang::SourceManager const&, bool&) (emmintrin.h:606)
==9809== by 0x233D0E0:
clang::SourceManager::getLineNumber(clang::FileID, unsigned int,
bool*) const (SourceManager.cpp:1307)
==9809== by 0x233D6E7:
clang::SourceManager::getPresumedLoc(clang::SourceLocation, bool)
const (SourceManager.cpp:1470)
==9809== by 0x233657C:
clang::SourceLocation::print(llvm::raw_ostream&, clang::SourceManager
const&) const (SourceLocation.cpp:45)
==9809== by 0x31EDF16: (anonymous
namespace)::PrettyStackTraceParserEntry::print(llvm::raw_ostream&)
const (ParseAST.cpp:57)
==9809== by 0x2202BE2: PrintStack(llvm::PrettyStackTraceEntry
const*, llvm::raw_ostream&) (PrettyStackTrace.cpp:40)
==9809== by 0x2202B90: PrintStack(llvm::PrettyStackTraceEntry
const*, llvm::raw_ostream&) (PrettyStackTrace.cpp:36)
==9809== by 0x2202B90: PrintStack(llvm::PrettyStackTraceEntry
const*, llvm::raw_ostream&) (PrettyStackTrace.cpp:36)
==9809== by 0x2202B90: PrintStack(llvm::PrettyStackTraceEntry
const*, llvm::raw_ostream&) (PrettyStackTrace.cpp:36)
==9809== by 0x2202C56: PrintCurStackTrace(llvm::raw_ostream&)
(PrettyStackTrace.cpp:54)
==9809== by 0x2202C80: CrashHandler(void*) (PrettyStackTrace.cpp:79)
==9809== by 0x223B42D: SignalHandler(int) (Signals.inc:199)
/fio/tnakamura/ninja/1/tools/clang/test/SemaTemplate/Output/instantiate-exception-spec-cxx11.cpp.script:
line 1: 9809 Segmentation fault
/home/tnakamura/fio/ninja/1/./bin/clang -cc1 -internal-isystem
/fio/tnakamura/ninja/1/bin/../lib/clang/3.6.0/include -nostdsysteminc
-fsyntax-only -verify -triple x86_64-unknown-linux-gnu -std=c++11
-ftemplate-depth 16 -fcxx-exceptions -fexceptions
/fio/tnakamura/ninja/llvm-project/clang/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
--
2014-10-17 8:00 GMT+09:00 Richard Smith <richard-llvm at metafoo.co.uk>:
> Author: rsmith
> Date: Thu Oct 16 18:00:46 2014
> New Revision: 219977
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219977&view=rev
> Log:
> Re-commit r217995 and follow-up patches (r217997, r218011, r218053). These were
> reverted in r218058 because they triggered a rejects-valid bug in MSVC.
>
> Original commit message from r217995:
>
> Instantiate exception specifications when instantiating function types (other
> than the type of a function declaration). We previously didn't instantiate
> these at all! This also covers the pathological case where the only mention of
> a parameter pack is within the exception specification; this gives us a second
> way (other than alias templates) to reach the horrible state where a type
> contains an unexpanded pack, but its canonical type does not.
>
> Modified:
> cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h
> cfe/trunk/include/clang/AST/Expr.h
> cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> cfe/trunk/include/clang/AST/Type.h
> cfe/trunk/include/clang/Sema/Sema.h
> cfe/trunk/lib/AST/Type.cpp
> cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> cfe/trunk/lib/Sema/SemaExceptionSpec.cpp
> cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
> cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> cfe/trunk/lib/Sema/SemaType.cpp
> cfe/trunk/lib/Sema/TreeTransform.h
> cfe/trunk/test/CXX/except/except.spec/p1.cpp
> cfe/trunk/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
> cfe/trunk/test/SemaTemplate/instantiate-exception-spec.cpp
>
> Modified: cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h Thu Oct 16 18:00:46 2014
> @@ -878,6 +878,9 @@ DEF_TRAVERSE_TYPE(FunctionProtoType, {
> for (const auto &E : T->exceptions()) {
> TRY_TO(TraverseType(E));
> }
> +
> + if (Expr *NE = T->getNoexceptExpr())
> + TRY_TO(TraverseStmt(NE));
> })
>
> DEF_TRAVERSE_TYPE(UnresolvedUsingType, {})
> @@ -1086,6 +1089,9 @@ DEF_TRAVERSE_TYPELOC(FunctionProtoType,
> for (const auto &E : T->exceptions()) {
> TRY_TO(TraverseType(E));
> }
> +
> + if (Expr *NE = T->getNoexceptExpr())
> + TRY_TO(TraverseStmt(NE));
> })
>
> DEF_TRAVERSE_TYPELOC(UnresolvedUsingType, {})
> @@ -2125,21 +2131,29 @@ bool RecursiveASTVisitor<Derived>::Trave
> TRY_TO(TraverseLambdaCapture(S, C));
> }
>
> - if (S->hasExplicitParameters() || S->hasExplicitResultType()) {
> - TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
> - if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
> - // Visit the whole type.
> - TRY_TO(TraverseTypeLoc(TL));
> - } else if (FunctionProtoTypeLoc Proto = TL.getAs<FunctionProtoTypeLoc>()) {
> - if (S->hasExplicitParameters()) {
> - // Visit parameters.
> - for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) {
> - TRY_TO(TraverseDecl(Proto.getParam(I)));
> - }
> - } else {
> - TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
> + TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
> + FunctionProtoTypeLoc Proto = TL.castAs<FunctionProtoTypeLoc>();
> +
> + if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
> + // Visit the whole type.
> + TRY_TO(TraverseTypeLoc(TL));
> + } else {
> + if (S->hasExplicitParameters()) {
> + // Visit parameters.
> + for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) {
> + TRY_TO(TraverseDecl(Proto.getParam(I)));
> }
> + } else if (S->hasExplicitResultType()) {
> + TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
> }
> +
> + auto *T = Proto.getTypePtr();
> + for (const auto &E : T->exceptions()) {
> + TRY_TO(TraverseType(E));
> + }
> +
> + if (Expr *NE = T->getNoexceptExpr())
> + TRY_TO(TraverseStmt(NE));
> }
>
> TRY_TO(TraverseLambdaBody(S));
>
> Modified: cfe/trunk/include/clang/AST/Expr.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Expr.h (original)
> +++ cfe/trunk/include/clang/AST/Expr.h Thu Oct 16 18:00:46 2014
> @@ -2678,20 +2678,23 @@ private:
> }
>
> protected:
> - CastExpr(StmtClass SC, QualType ty, ExprValueKind VK,
> - const CastKind kind, Expr *op, unsigned BasePathSize) :
> - Expr(SC, ty, VK, OK_Ordinary,
> - // Cast expressions are type-dependent if the type is
> - // dependent (C++ [temp.dep.expr]p3).
> - ty->isDependentType(),
> - // Cast expressions are value-dependent if the type is
> - // dependent or if the subexpression is value-dependent.
> - ty->isDependentType() || (op && op->isValueDependent()),
> - (ty->isInstantiationDependentType() ||
> - (op && op->isInstantiationDependent())),
> - (ty->containsUnexpandedParameterPack() ||
> - (op && op->containsUnexpandedParameterPack()))),
> - Op(op) {
> + CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind,
> + Expr *op, unsigned BasePathSize)
> + : Expr(SC, ty, VK, OK_Ordinary,
> + // Cast expressions are type-dependent if the type is
> + // dependent (C++ [temp.dep.expr]p3).
> + ty->isDependentType(),
> + // Cast expressions are value-dependent if the type is
> + // dependent or if the subexpression is value-dependent.
> + ty->isDependentType() || (op && op->isValueDependent()),
> + (ty->isInstantiationDependentType() ||
> + (op && op->isInstantiationDependent())),
> + // An implicit cast expression doesn't (lexically) contain an
> + // unexpanded pack, even if its target type does.
> + ((SC != ImplicitCastExprClass &&
> + ty->containsUnexpandedParameterPack()) ||
> + (op && op->containsUnexpandedParameterPack()))),
> + Op(op) {
> assert(kind != CK_Invalid && "creating cast with invalid cast kind");
> CastExprBits.Kind = kind;
> setBasePathSize(BasePathSize);
>
> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Thu Oct 16 18:00:46 2014
> @@ -943,6 +943,9 @@ DEF_TRAVERSE_TYPE(FunctionProtoType, {
> for (const auto &E : T->exceptions()) {
> TRY_TO(TraverseType(E));
> }
> +
> + if (Expr *NE = T->getNoexceptExpr())
> + TRY_TO(TraverseStmt(NE));
> })
>
> DEF_TRAVERSE_TYPE(UnresolvedUsingType, {})
> @@ -1151,6 +1154,9 @@ DEF_TRAVERSE_TYPELOC(FunctionProtoType,
> for (const auto &E : T->exceptions()) {
> TRY_TO(TraverseType(E));
> }
> +
> + if (Expr *NE = T->getNoexceptExpr())
> + TRY_TO(TraverseStmt(NE));
> })
>
> DEF_TRAVERSE_TYPELOC(UnresolvedUsingType, {})
> @@ -2147,21 +2153,29 @@ bool RecursiveASTVisitor<Derived>::Trave
> TRY_TO(TraverseLambdaCapture(S, C));
> }
>
> - if (S->hasExplicitParameters() || S->hasExplicitResultType()) {
> - TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
> - if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
> - // Visit the whole type.
> - TRY_TO(TraverseTypeLoc(TL));
> - } else if (FunctionProtoTypeLoc Proto = TL.getAs<FunctionProtoTypeLoc>()) {
> - if (S->hasExplicitParameters()) {
> - // Visit parameters.
> - for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) {
> - TRY_TO(TraverseDecl(Proto.getParam(I)));
> - }
> - } else {
> - TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
> + TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
> + FunctionProtoTypeLoc Proto = TL.castAs<FunctionProtoTypeLoc>();
> +
> + if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
> + // Visit the whole type.
> + TRY_TO(TraverseTypeLoc(TL));
> + } else {
> + if (S->hasExplicitParameters()) {
> + // Visit parameters.
> + for (unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) {
> + TRY_TO(TraverseDecl(Proto.getParam(I)));
> }
> + } else if (S->hasExplicitResultType()) {
> + TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
> }
> +
> + auto *T = Proto.getTypePtr();
> + for (const auto &E : T->exceptions()) {
> + TRY_TO(TraverseType(E));
> + }
> +
> + if (Expr *NE = T->getNoexceptExpr())
> + TRY_TO(TraverseStmt(NE));
> }
>
> TRY_TO(TraverseLambdaBody(S));
>
> Modified: cfe/trunk/include/clang/AST/Type.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Type.h (original)
> +++ cfe/trunk/include/clang/AST/Type.h Thu Oct 16 18:00:46 2014
> @@ -3012,6 +3012,8 @@ public:
> bool hasNoexceptExceptionSpec() const {
> return isNoexceptExceptionSpec(getExceptionSpecType());
> }
> + /// \brief Return whether this function has a dependent exception spec.
> + bool hasDependentExceptionSpec() const;
> /// \brief Result type of getNoexceptSpec().
> enum NoexceptResult {
> NR_NoNoexcept, ///< There is no noexcept specifier.
> @@ -5247,8 +5249,8 @@ template <typename T> const T *Type::cas
> ArrayType_cannot_be_used_with_getAs<T> at;
> (void) at;
>
> - assert(isa<T>(CanonicalType));
> if (const T *ty = dyn_cast<T>(this)) return ty;
> + assert(isa<T>(CanonicalType));
> return cast<T>(getUnqualifiedDesugaredType());
> }
>
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Thu Oct 16 18:00:46 2014
> @@ -4036,7 +4036,8 @@ public:
>
> /// \brief Check the given exception-specification and update the
> /// exception specification information with the results.
> - void checkExceptionSpecification(ExceptionSpecificationType EST,
> + void checkExceptionSpecification(bool IsTopLevel,
> + ExceptionSpecificationType EST,
> ArrayRef<ParsedType> DynamicExceptions,
> ArrayRef<SourceRange> DynamicExceptionRanges,
> Expr *NoexceptExpr,
> @@ -6675,6 +6676,8 @@ public:
> DeclarationName Entity,
> CXXRecordDecl *ThisContext,
> unsigned ThisTypeQuals);
> + void SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto,
> + const MultiLevelTemplateArgumentList &Args);
> ParmVarDecl *SubstParmVarDecl(ParmVarDecl *D,
> const MultiLevelTemplateArgumentList &TemplateArgs,
> int indexAdjustment,
>
> Modified: cfe/trunk/lib/AST/Type.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Type.cpp (original)
> +++ cfe/trunk/lib/AST/Type.cpp Thu Oct 16 18:00:46 2014
> @@ -1623,9 +1623,9 @@ FunctionProtoType::FunctionProtoType(Qua
> QualType *exnSlot = argSlot + NumParams;
> unsigned I = 0;
> for (QualType ExceptionType : epi.ExceptionSpec.Exceptions) {
> - if (ExceptionType->isDependentType())
> - setDependent();
> - else if (ExceptionType->isInstantiationDependentType())
> + // Note that a dependent exception specification does *not* make
> + // a type dependent; it's not even part of the C++ type system.
> + if (ExceptionType->isInstantiationDependentType())
> setInstantiationDependent();
>
> if (ExceptionType->containsUnexpandedParameterPack())
> @@ -1639,11 +1639,12 @@ FunctionProtoType::FunctionProtoType(Qua
> *noexSlot = epi.ExceptionSpec.NoexceptExpr;
>
> if (epi.ExceptionSpec.NoexceptExpr) {
> - if (epi.ExceptionSpec.NoexceptExpr->isValueDependent()
> - || epi.ExceptionSpec.NoexceptExpr->isTypeDependent())
> - setDependent();
> - else if (epi.ExceptionSpec.NoexceptExpr->isInstantiationDependent())
> + if (epi.ExceptionSpec.NoexceptExpr->isValueDependent() ||
> + epi.ExceptionSpec.NoexceptExpr->isInstantiationDependent())
> setInstantiationDependent();
> +
> + if (epi.ExceptionSpec.NoexceptExpr->containsUnexpandedParameterPack())
> + setContainsUnexpandedParameterPack();
> }
> } else if (getExceptionSpecType() == EST_Uninstantiated) {
> // Store the function decl from which we will resolve our
> @@ -1669,6 +1670,18 @@ FunctionProtoType::FunctionProtoType(Qua
> }
> }
>
> +bool FunctionProtoType::hasDependentExceptionSpec() const {
> + if (Expr *NE = getNoexceptExpr())
> + return NE->isValueDependent();
> + for (QualType ET : exceptions())
> + // A pack expansion with a non-dependent pattern is still dependent,
> + // because we don't know whether the pattern is in the exception spec
> + // or not (that depends on whether the pack has 0 expansions).
> + if (ET->isDependentType() || ET->getAs<PackExpansionType>())
> + return true;
> + return false;
> +}
> +
> FunctionProtoType::NoexceptResult
> FunctionProtoType::getNoexceptSpec(const ASTContext &ctx) const {
> ExceptionSpecificationType est = getExceptionSpecType();
>
> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Thu Oct 16 18:00:46 2014
> @@ -13168,13 +13168,12 @@ bool Sema::checkThisInStaticMemberFuncti
> return false;
> }
>
> -void
> -Sema::checkExceptionSpecification(ExceptionSpecificationType EST,
> - ArrayRef<ParsedType> DynamicExceptions,
> - ArrayRef<SourceRange> DynamicExceptionRanges,
> - Expr *NoexceptExpr,
> - SmallVectorImpl<QualType> &Exceptions,
> - FunctionProtoType::ExceptionSpecInfo &ESI) {
> +void Sema::checkExceptionSpecification(
> + bool IsTopLevel, ExceptionSpecificationType EST,
> + ArrayRef<ParsedType> DynamicExceptions,
> + ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr,
> + SmallVectorImpl<QualType> &Exceptions,
> + FunctionProtoType::ExceptionSpecInfo &ESI) {
> Exceptions.clear();
> ESI.Type = EST;
> if (EST == EST_Dynamic) {
> @@ -13183,13 +13182,15 @@ Sema::checkExceptionSpecification(Except
> // FIXME: Preserve type source info.
> QualType ET = GetTypeFromParser(DynamicExceptions[ei]);
>
> - SmallVector<UnexpandedParameterPack, 2> Unexpanded;
> - collectUnexpandedParameterPacks(ET, Unexpanded);
> - if (!Unexpanded.empty()) {
> - DiagnoseUnexpandedParameterPacks(DynamicExceptionRanges[ei].getBegin(),
> - UPPC_ExceptionType,
> - Unexpanded);
> - continue;
> + if (IsTopLevel) {
> + SmallVector<UnexpandedParameterPack, 2> Unexpanded;
> + collectUnexpandedParameterPacks(ET, Unexpanded);
> + if (!Unexpanded.empty()) {
> + DiagnoseUnexpandedParameterPacks(
> + DynamicExceptionRanges[ei].getBegin(), UPPC_ExceptionType,
> + Unexpanded);
> + continue;
> + }
> }
>
> // Check that the type is valid for an exception spec, and
> @@ -13208,7 +13209,8 @@ Sema::checkExceptionSpecification(Except
> NoexceptExpr->getType()->getCanonicalTypeUnqualified() ==
> Context.BoolTy) &&
> "Parser should have made sure that the expression is boolean");
> - if (NoexceptExpr && DiagnoseUnexpandedParameterPack(NoexceptExpr)) {
> + if (IsTopLevel && NoexceptExpr &&
> + DiagnoseUnexpandedParameterPack(NoexceptExpr)) {
> ESI.Type = EST_BasicNoexcept;
> return;
> }
>
> Modified: cfe/trunk/lib/Sema/SemaExceptionSpec.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExceptionSpec.cpp?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExceptionSpec.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExceptionSpec.cpp Thu Oct 16 18:00:46 2014
> @@ -720,10 +720,11 @@ static bool CheckSpecForTypesEquivalent(
> /// assignment and override compatibility check. We do not check the parameters
> /// of parameter function pointers recursively, as no sane programmer would
> /// even be able to write such a function type.
> -bool Sema::CheckParamExceptionSpec(const PartialDiagnostic & NoteID,
> - const FunctionProtoType *Target, SourceLocation TargetLoc,
> - const FunctionProtoType *Source, SourceLocation SourceLoc)
> -{
> +bool Sema::CheckParamExceptionSpec(const PartialDiagnostic &NoteID,
> + const FunctionProtoType *Target,
> + SourceLocation TargetLoc,
> + const FunctionProtoType *Source,
> + SourceLocation SourceLoc) {
> if (CheckSpecForTypesEquivalent(
> *this, PDiag(diag::err_deep_exception_specs_differ) << 0, PDiag(),
> Target->getReturnType(), TargetLoc, Source->getReturnType(),
> @@ -744,23 +745,30 @@ bool Sema::CheckParamExceptionSpec(const
> return false;
> }
>
> -bool Sema::CheckExceptionSpecCompatibility(Expr *From, QualType ToType)
> -{
> +bool Sema::CheckExceptionSpecCompatibility(Expr *From, QualType ToType) {
> // First we check for applicability.
> // Target type must be a function, function pointer or function reference.
> const FunctionProtoType *ToFunc = GetUnderlyingFunction(ToType);
> - if (!ToFunc)
> + if (!ToFunc || ToFunc->hasDependentExceptionSpec())
> return false;
>
> // SourceType must be a function or function pointer.
> const FunctionProtoType *FromFunc = GetUnderlyingFunction(From->getType());
> - if (!FromFunc)
> + if (!FromFunc || FromFunc->hasDependentExceptionSpec())
> return false;
>
> // Now we've got the correct types on both sides, check their compatibility.
> // This means that the source of the conversion can only throw a subset of
> // the exceptions of the target, and any exception specs on arguments or
> // return types must be equivalent.
> + //
> + // FIXME: If there is a nested dependent exception specification, we should
> + // not be checking it here. This is fine:
> + // template<typename T> void f() {
> + // void (*p)(void (*) throw(T));
> + // void (*q)(void (*) throw(int)) = p;
> + // }
> + // ... because it might be instantiated with T=int.
> return CheckExceptionSpecSubset(PDiag(diag::err_incompatible_exception_specs),
> PDiag(), ToFunc,
> From->getSourceRange().getBegin(),
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Thu Oct 16 18:00:46 2014
> @@ -791,11 +791,17 @@ namespace {
> ExprResult TransformFunctionParmPackExpr(FunctionParmPackExpr *E);
>
> QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
> - FunctionProtoTypeLoc TL);
> + FunctionProtoTypeLoc TL) {
> + // Call the base version; it will forward to our overridden version below.
> + return inherited::TransformFunctionProtoType(TLB, TL);
> + }
> +
> + template<typename Fn>
> QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
> FunctionProtoTypeLoc TL,
> CXXRecordDecl *ThisContext,
> - unsigned ThisTypeQuals);
> + unsigned ThisTypeQuals,
> + Fn TransformExceptionSpec);
>
> ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
> int indexAdjustment,
> @@ -1327,21 +1333,16 @@ ExprResult TemplateInstantiator::Transfo
> E->getParam());
> }
>
> -QualType TemplateInstantiator::TransformFunctionProtoType(TypeLocBuilder &TLB,
> - FunctionProtoTypeLoc TL) {
> - // We need a local instantiation scope for this function prototype.
> - LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true);
> - return inherited::TransformFunctionProtoType(TLB, TL);
> -}
> -
> +template<typename Fn>
> QualType TemplateInstantiator::TransformFunctionProtoType(TypeLocBuilder &TLB,
> FunctionProtoTypeLoc TL,
> CXXRecordDecl *ThisContext,
> - unsigned ThisTypeQuals) {
> + unsigned ThisTypeQuals,
> + Fn TransformExceptionSpec) {
> // We need a local instantiation scope for this function prototype.
> LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true);
> - return inherited::TransformFunctionProtoType(TLB, TL, ThisContext,
> - ThisTypeQuals);
> + return inherited::TransformFunctionProtoType(
> + TLB, TL, ThisContext, ThisTypeQuals, TransformExceptionSpec);
> }
>
> ParmVarDecl *
> @@ -1576,7 +1577,8 @@ static bool NeedsInstantiationAsFunction
>
> /// A form of SubstType intended specifically for instantiating the
> /// type of a FunctionDecl. Its purpose is solely to force the
> -/// instantiation of default-argument expressions.
> +/// instantiation of default-argument expressions and to avoid
> +/// instantiating an exception-specification.
> TypeSourceInfo *Sema::SubstFunctionDeclType(TypeSourceInfo *T,
> const MultiLevelTemplateArgumentList &Args,
> SourceLocation Loc,
> @@ -1599,9 +1601,17 @@ TypeSourceInfo *Sema::SubstFunctionDeclT
>
> QualType Result;
>
> - if (FunctionProtoTypeLoc Proto = TL.getAs<FunctionProtoTypeLoc>()) {
> - Result = Instantiator.TransformFunctionProtoType(TLB, Proto, ThisContext,
> - ThisTypeQuals);
> + if (FunctionProtoTypeLoc Proto =
> + TL.IgnoreParens().getAs<FunctionProtoTypeLoc>()) {
> + // Instantiate the type, other than its exception specification. The
> + // exception specification is instantiated in InitFunctionInstantiation
> + // once we've built the FunctionDecl.
> + // FIXME: Set the exception specification to EST_Uninstantiated here,
> + // instead of rebuilding the function type again later.
> + Result = Instantiator.TransformFunctionProtoType(
> + TLB, Proto, ThisContext, ThisTypeQuals,
> + [](FunctionProtoType::ExceptionSpecInfo &ESI,
> + bool &Changed) { return false; });
> } else {
> Result = Instantiator.TransformType(TLB, TL);
> }
> @@ -1611,6 +1621,26 @@ TypeSourceInfo *Sema::SubstFunctionDeclT
> return TLB.getTypeSourceInfo(Context, Result);
> }
>
> +void Sema::SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto,
> + const MultiLevelTemplateArgumentList &Args) {
> + FunctionProtoType::ExceptionSpecInfo ESI =
> + Proto->getExtProtoInfo().ExceptionSpec;
> + assert(ESI.Type != EST_Uninstantiated);
> +
> + TemplateInstantiator Instantiator(*this, Args, New->getLocation(),
> + New->getDeclName());
> +
> + SmallVector<QualType, 4> ExceptionStorage;
> + bool Changed = false;
> + if (Instantiator.TransformExceptionSpec(
> + New->getTypeSourceInfo()->getTypeLoc().getLocEnd(), ESI,
> + ExceptionStorage, Changed))
> + // On error, recover by dropping the exception specification.
> + ESI.Type = EST_None;
> +
> + UpdateExceptionSpec(New, ESI);
> +}
> +
> ParmVarDecl *Sema::SubstParmVarDecl(ParmVarDecl *OldParm,
> const MultiLevelTemplateArgumentList &TemplateArgs,
> int indexAdjustment,
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Thu Oct 16 18:00:46 2014
> @@ -3056,7 +3056,7 @@ TemplateDeclInstantiator::SubstFunctionT
> /// Introduce the instantiated function parameters into the local
> /// instantiation scope, and set the parameter names to those used
> /// in the template.
> -static void addInstantiatedParametersToScope(Sema &S, FunctionDecl *Function,
> +static bool addInstantiatedParametersToScope(Sema &S, FunctionDecl *Function,
> const FunctionDecl *PatternDecl,
> LocalInstantiationScope &Scope,
> const MultiLevelTemplateArgumentList &TemplateArgs) {
> @@ -3067,15 +3067,22 @@ static void addInstantiatedParametersToS
> // Simple case: not a parameter pack.
> assert(FParamIdx < Function->getNumParams());
> ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx);
> + FunctionParam->setDeclName(PatternParam->getDeclName());
> // If the parameter's type is not dependent, update it to match the type
> // in the pattern. They can differ in top-level cv-qualifiers, and we want
> // the pattern's type here. If the type is dependent, they can't differ,
> - // per core issue 1668.
> + // per core issue 1668. Substitute into the type from the pattern, in case
> + // it's instantiation-dependent.
> // FIXME: Updating the type to work around this is at best fragile.
> - if (!PatternDecl->getType()->isDependentType())
> - FunctionParam->setType(PatternParam->getType());
> + if (!PatternDecl->getType()->isDependentType()) {
> + QualType T = S.SubstType(PatternParam->getType(), TemplateArgs,
> + FunctionParam->getLocation(),
> + FunctionParam->getDeclName());
> + if (T.isNull())
> + return true;
> + FunctionParam->setType(T);
> + }
>
> - FunctionParam->setDeclName(PatternParam->getDeclName());
> Scope.InstantiatedLocal(PatternParam, FunctionParam);
> ++FParamIdx;
> continue;
> @@ -3087,136 +3094,27 @@ static void addInstantiatedParametersToS
> = S.getNumArgumentsInExpansion(PatternParam->getType(), TemplateArgs);
> assert(NumArgumentsInExpansion &&
> "should only be called when all template arguments are known");
> + QualType PatternType =
> + PatternParam->getType()->castAs<PackExpansionType>()->getPattern();
> for (unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
> ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx);
> - if (!PatternDecl->getType()->isDependentType())
> - FunctionParam->setType(PatternParam->getType());
> -
> FunctionParam->setDeclName(PatternParam->getDeclName());
> - Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam);
> - ++FParamIdx;
> - }
> - }
> -}
> -
> -static void InstantiateExceptionSpec(Sema &SemaRef, FunctionDecl *New,
> - const FunctionProtoType *Proto,
> - const MultiLevelTemplateArgumentList &TemplateArgs) {
> - assert(Proto->getExceptionSpecType() != EST_Uninstantiated);
> -
> - // C++11 [expr.prim.general]p3:
> - // If a declaration declares a member function or member function
> - // template of a class X, the expression this is a prvalue of type
> - // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
> - // and the end of the function-definition, member-declarator, or
> - // declarator.
> - CXXRecordDecl *ThisContext = nullptr;
> - unsigned ThisTypeQuals = 0;
> - if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(New)) {
> - ThisContext = Method->getParent();
> - ThisTypeQuals = Method->getTypeQualifiers();
> - }
> - Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals,
> - SemaRef.getLangOpts().CPlusPlus11);
> -
> - // The function has an exception specification or a "noreturn"
> - // attribute. Substitute into each of the exception types.
> - SmallVector<QualType, 4> Exceptions;
> - for (unsigned I = 0, N = Proto->getNumExceptions(); I != N; ++I) {
> - // FIXME: Poor location information!
> - if (const PackExpansionType *PackExpansion
> - = Proto->getExceptionType(I)->getAs<PackExpansionType>()) {
> - // We have a pack expansion. Instantiate it.
> - SmallVector<UnexpandedParameterPack, 2> Unexpanded;
> - SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
> - Unexpanded);
> - assert(!Unexpanded.empty() &&
> - "Pack expansion without parameter packs?");
> -
> - bool Expand = false;
> - bool RetainExpansion = false;
> - Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
> - if (SemaRef.CheckParameterPacksForExpansion(New->getLocation(),
> - SourceRange(),
> - Unexpanded,
> - TemplateArgs,
> - Expand,
> - RetainExpansion,
> - NumExpansions))
> - break;
> -
> - if (!Expand) {
> - // We can't expand this pack expansion into separate arguments yet;
> - // just substitute into the pattern and create a new pack expansion
> - // type.
> - Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1);
> - QualType T = SemaRef.SubstType(PackExpansion->getPattern(),
> - TemplateArgs,
> - New->getLocation(), New->getDeclName());
> + if (!PatternDecl->getType()->isDependentType()) {
> + Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(S, Arg);
> + QualType T = S.SubstType(PatternType, TemplateArgs,
> + FunctionParam->getLocation(),
> + FunctionParam->getDeclName());
> if (T.isNull())
> - break;
> -
> - T = SemaRef.Context.getPackExpansionType(T, NumExpansions);
> - Exceptions.push_back(T);
> - continue;
> - }
> -
> - // Substitute into the pack expansion pattern for each template
> - bool Invalid = false;
> - for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
> - Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, ArgIdx);
> -
> - QualType T = SemaRef.SubstType(PackExpansion->getPattern(),
> - TemplateArgs,
> - New->getLocation(), New->getDeclName());
> - if (T.isNull()) {
> - Invalid = true;
> - break;
> - }
> -
> - Exceptions.push_back(T);
> + return true;
> + FunctionParam->setType(T);
> }
>
> - if (Invalid)
> - break;
> -
> - continue;
> - }
> -
> - QualType T
> - = SemaRef.SubstType(Proto->getExceptionType(I), TemplateArgs,
> - New->getLocation(), New->getDeclName());
> - if (T.isNull() ||
> - SemaRef.CheckSpecifiedExceptionType(T, New->getLocation()))
> - continue;
> -
> - Exceptions.push_back(T);
> - }
> - Expr *NoexceptExpr = nullptr;
> - if (Expr *OldNoexceptExpr = Proto->getNoexceptExpr()) {
> - EnterExpressionEvaluationContext Unevaluated(SemaRef,
> - Sema::ConstantEvaluated);
> - ExprResult E = SemaRef.SubstExpr(OldNoexceptExpr, TemplateArgs);
> - if (E.isUsable())
> - E = SemaRef.CheckBooleanCondition(E.get(), E.get()->getLocStart());
> -
> - if (E.isUsable()) {
> - NoexceptExpr = E.get();
> - if (!NoexceptExpr->isTypeDependent() &&
> - !NoexceptExpr->isValueDependent())
> - NoexceptExpr
> - = SemaRef.VerifyIntegerConstantExpression(NoexceptExpr,
> - nullptr, diag::err_noexcept_needs_constant_expression,
> - /*AllowFold*/ false).get();
> + Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam);
> + ++FParamIdx;
> }
> }
>
> - FunctionProtoType::ExceptionSpecInfo ESI;
> - ESI.Type = Proto->getExceptionSpecType();
> - ESI.Exceptions = Exceptions;
> - ESI.NoexceptExpr = NoexceptExpr;
> -
> - SemaRef.UpdateExceptionSpec(New, ESI);
> + return false;
> }
>
> void Sema::InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
> @@ -3243,11 +3141,14 @@ void Sema::InstantiateExceptionSpec(Sour
> getTemplateInstantiationArgs(Decl, nullptr, /*RelativeToPrimary*/true);
>
> FunctionDecl *Template = Proto->getExceptionSpecTemplate();
> - addInstantiatedParametersToScope(*this, Decl, Template, Scope, TemplateArgs);
> + if (addInstantiatedParametersToScope(*this, Decl, Template, Scope,
> + TemplateArgs)) {
> + UpdateExceptionSpec(Decl, EST_None);
> + return;
> + }
>
> - ::InstantiateExceptionSpec(*this, Decl,
> - Template->getType()->castAs<FunctionProtoType>(),
> - TemplateArgs);
> + SubstExceptionSpec(Decl, Template->getType()->castAs<FunctionProtoType>(),
> + TemplateArgs);
> }
>
> /// \brief Initializes the common fields of an instantiation function
> @@ -3316,7 +3217,7 @@ TemplateDeclInstantiator::InitFunctionIn
> New->setType(SemaRef.Context.getFunctionType(
> NewProto->getReturnType(), NewProto->getParamTypes(), EPI));
> } else {
> - ::InstantiateExceptionSpec(SemaRef, New, Proto, TemplateArgs);
> + SemaRef.SubstExceptionSpec(New, Proto, TemplateArgs);
> }
> }
>
> @@ -3506,8 +3407,9 @@ void Sema::InstantiateFunctionDefinition
> MultiLevelTemplateArgumentList TemplateArgs =
> getTemplateInstantiationArgs(Function, nullptr, false, PatternDecl);
>
> - addInstantiatedParametersToScope(*this, Function, PatternDecl, Scope,
> - TemplateArgs);
> + if (addInstantiatedParametersToScope(*this, Function, PatternDecl, Scope,
> + TemplateArgs))
> + return;
>
> // If this is a constructor, instantiate the member initializers.
> if (const CXXConstructorDecl *Ctor =
>
> Modified: cfe/trunk/lib/Sema/SemaType.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaType.cpp Thu Oct 16 18:00:46 2014
> @@ -2989,7 +2989,8 @@ static TypeSourceInfo *GetFullTypeForDec
> NoexceptExpr = FTI.NoexceptExpr;
> }
>
> - S.checkExceptionSpecification(FTI.getExceptionSpecType(),
> + S.checkExceptionSpecification(D.isFunctionDeclarationContext(),
> + FTI.getExceptionSpecType(),
> DynamicExceptions,
> DynamicExceptionRanges,
> NoexceptExpr,
>
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Thu Oct 16 18:00:46 2014
> @@ -563,10 +563,17 @@ public:
> QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
> #include "clang/AST/TypeLocNodes.def"
>
> + template<typename Fn>
> QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
> FunctionProtoTypeLoc TL,
> CXXRecordDecl *ThisContext,
> - unsigned ThisTypeQuals);
> + unsigned ThisTypeQuals,
> + Fn TransformExceptionSpec);
> +
> + bool TransformExceptionSpec(SourceLocation Loc,
> + FunctionProtoType::ExceptionSpecInfo &ESI,
> + SmallVectorImpl<QualType> &Exceptions,
> + bool &Changed);
>
> StmtResult TransformSEHHandler(Stmt *Handler);
>
> @@ -4550,15 +4557,19 @@ template<typename Derived>
> QualType
> TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
> FunctionProtoTypeLoc TL) {
> - return getDerived().TransformFunctionProtoType(TLB, TL, nullptr, 0);
> + SmallVector<QualType, 4> ExceptionStorage;
> + return getDerived().TransformFunctionProtoType(
> + TLB, TL, nullptr, 0,
> + [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
> + return TransformExceptionSpec(TL.getBeginLoc(), ESI, ExceptionStorage,
> + Changed);
> + });
> }
>
> -template<typename Derived>
> -QualType
> -TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
> - FunctionProtoTypeLoc TL,
> - CXXRecordDecl *ThisContext,
> - unsigned ThisTypeQuals) {
> +template<typename Derived> template<typename Fn>
> +QualType TreeTransform<Derived>::TransformFunctionProtoType(
> + TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
> + unsigned ThisTypeQuals, Fn TransformExceptionSpec) {
> // Transform the parameters and return type.
> //
> // We are required to instantiate the params and return type in source order.
> @@ -4603,15 +4614,21 @@ TreeTransform<Derived>::TransformFunctio
> return QualType();
> }
>
> - // FIXME: Need to transform the exception-specification too.
> + FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
> +
> + bool EPIChanged = false;
> + if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
> + return QualType();
> +
> + // FIXME: Need to transform ConsumedParameters for variadic template
> + // expansion.
>
> QualType Result = TL.getType();
> if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
> T->getNumParams() != ParamTypes.size() ||
> !std::equal(T->param_type_begin(), T->param_type_end(),
> - ParamTypes.begin())) {
> - Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes,
> - T->getExtProtoInfo());
> + ParamTypes.begin()) || EPIChanged) {
> + Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
> if (Result.isNull())
> return QualType();
> }
> @@ -4628,6 +4645,107 @@ TreeTransform<Derived>::TransformFunctio
> }
>
> template<typename Derived>
> +bool TreeTransform<Derived>::TransformExceptionSpec(
> + SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
> + SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
> + assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
> +
> + // Instantiate a dynamic noexcept expression, if any.
> + if (ESI.Type == EST_ComputedNoexcept) {
> + EnterExpressionEvaluationContext Unevaluated(getSema(),
> + Sema::ConstantEvaluated);
> + ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
> + if (NoexceptExpr.isInvalid())
> + return true;
> +
> + NoexceptExpr = getSema().CheckBooleanCondition(
> + NoexceptExpr.get(), NoexceptExpr.get()->getLocStart());
> + if (NoexceptExpr.isInvalid())
> + return true;
> +
> + if (!NoexceptExpr.get()->isValueDependent()) {
> + NoexceptExpr = getSema().VerifyIntegerConstantExpression(
> + NoexceptExpr.get(), nullptr,
> + diag::err_noexcept_needs_constant_expression,
> + /*AllowFold*/false);
> + if (NoexceptExpr.isInvalid())
> + return true;
> + }
> +
> + if (ESI.NoexceptExpr != NoexceptExpr.get())
> + Changed = true;
> + ESI.NoexceptExpr = NoexceptExpr.get();
> + }
> +
> + if (ESI.Type != EST_Dynamic)
> + return false;
> +
> + // Instantiate a dynamic exception specification's type.
> + for (QualType T : ESI.Exceptions) {
> + if (const PackExpansionType *PackExpansion =
> + T->getAs<PackExpansionType>()) {
> + Changed = true;
> +
> + // We have a pack expansion. Instantiate it.
> + SmallVector<UnexpandedParameterPack, 2> Unexpanded;
> + SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
> + Unexpanded);
> + assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
> +
> + // Determine whether the set of unexpanded parameter packs can and
> + // should
> + // be expanded.
> + bool Expand = false;
> + bool RetainExpansion = false;
> + Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
> + // FIXME: Track the location of the ellipsis (and track source location
> + // information for the types in the exception specification in general).
> + if (getDerived().TryExpandParameterPacks(
> + Loc, SourceRange(), Unexpanded, Expand,
> + RetainExpansion, NumExpansions))
> + return true;
> +
> + if (!Expand) {
> + // We can't expand this pack expansion into separate arguments yet;
> + // just substitute into the pattern and create a new pack expansion
> + // type.
> + Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
> + QualType U = getDerived().TransformType(PackExpansion->getPattern());
> + if (U.isNull())
> + return true;
> +
> + U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
> + Exceptions.push_back(U);
> + continue;
> + }
> +
> + // Substitute into the pack expansion pattern for each slice of the
> + // pack.
> + for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
> + Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
> +
> + QualType U = getDerived().TransformType(PackExpansion->getPattern());
> + if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
> + return true;
> +
> + Exceptions.push_back(U);
> + }
> + } else {
> + QualType U = getDerived().TransformType(T);
> + if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
> + return true;
> + if (T != U)
> + Changed = true;
> +
> + Exceptions.push_back(U);
> + }
> + }
> +
> + ESI.Exceptions = Exceptions;
> + return false;
> +}
> +
> +template<typename Derived>
> QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
> TypeLocBuilder &TLB,
> FunctionNoProtoTypeLoc TL) {
> @@ -9005,9 +9123,13 @@ TreeTransform<Derived>::TransformLambdaE
> // transformed parameters.
>
> TypeLocBuilder NewCallOpTLBuilder;
> - QualType NewCallOpType = TransformFunctionProtoType(NewCallOpTLBuilder,
> - OldCallOpFPTL,
> - nullptr, 0);
> + SmallVector<QualType, 4> ExceptionStorage;
> + QualType NewCallOpType = TransformFunctionProtoType(
> + NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0,
> + [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
> + return TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
> + ExceptionStorage, Changed);
> + });
> NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
> NewCallOpType);
> }
>
> Modified: cfe/trunk/test/CXX/except/except.spec/p1.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/except/except.spec/p1.cpp?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/except/except.spec/p1.cpp (original)
> +++ cfe/trunk/test/CXX/except/except.spec/p1.cpp Thu Oct 16 18:00:46 2014
> @@ -77,5 +77,12 @@ namespace PR11084 {
> static int f() noexcept(1/X) { return 10; } // expected-error{{argument to noexcept specifier must be a constant expression}} expected-note{{division by zero}}
> };
>
> - void g() { A<0>::f(); } // expected-note{{in instantiation of exception specification for 'f' requested here}}
> + template<int X> void f() {
> + int (*p)() noexcept(1/X); // expected-error{{argument to noexcept specifier must be a constant expression}} expected-note{{division by zero}}
> + };
> +
> + void g() {
> + A<0>::f(); // expected-note{{in instantiation of exception specification for 'f'}}
> + f<0>(); // expected-note{{in instantiation of function template specialization}}
> + }
> }
>
> Modified: cfe/trunk/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp (original)
> +++ cfe/trunk/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp Thu Oct 16 18:00:46 2014
> @@ -58,6 +58,13 @@ namespace dr1330_example {
> S().f<S>(); // ok
> S().f<int>(); // expected-note {{instantiation of exception spec}}
> }
> +
> + template<typename T>
> + struct U {
> + void f() noexcept(T::error);
> + void (g)() noexcept(T::error);
> + };
> + U<int> uint; // ok
> }
>
> namespace core_19754_example {
> @@ -137,3 +144,37 @@ namespace PR12763 {
> };
> void X::g() {} // expected-note {{in instantiation of}}
> }
> +
> +namespace Variadic {
> + template<bool B> void check() { static_assert(B, ""); }
> + template<bool B, bool B2, bool ...Bs> void check() { static_assert(B, ""); check<B2, Bs...>(); }
> +
> + template<typename ...T> void consume(T...);
> +
> + template<typename ...T> void f(void (*...p)() throw (T)) {
> + void (*q[])() = { p... };
> + consume((p(),0)...);
> + }
> + template<bool ...B> void g(void (*...p)() noexcept (B)) {
> + consume((p(),0)...);
> + check<noexcept(p()) == B ...>();
> + }
> + template<typename ...T> void i() {
> + consume([]() throw(T) {} ...);
> + consume([]() noexcept(sizeof(T) == 4) {} ...);
> + }
> + template<bool ...B> void j() {
> + consume([](void (*p)() noexcept(B)) {
> + void (*q)() noexcept = p; // expected-error {{not superset of source}}
> + } ...);
> + }
> +
> + void z() {
> + f<int, char, double>(nullptr, nullptr, nullptr);
> + g<true, false, true>(nullptr, nullptr, nullptr);
> + i<int, long, short>();
> + j<true, true>();
> + j<true, false>(); // expected-note {{in instantiation of}}
> + }
> +
> +}
>
> Modified: cfe/trunk/test/SemaTemplate/instantiate-exception-spec.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-exception-spec.cpp?rev=219977&r1=219976&r2=219977&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaTemplate/instantiate-exception-spec.cpp (original)
> +++ cfe/trunk/test/SemaTemplate/instantiate-exception-spec.cpp Thu Oct 16 18:00:46 2014
> @@ -1,5 +1,7 @@
> -// RUN: %clang_cc1 -fsyntax-only -verify %s
> +// RUN: %clang_cc1 -fexceptions -fcxx-exceptions -verify %s -DERRORS
> +// RUN: %clang_cc1 -fexceptions -fcxx-exceptions -emit-llvm-only %s
>
> +#ifdef ERRORS
> template<typename T> void f1(T*) throw(T); // expected-error{{incomplete type 'Incomplete' is not allowed in exception specification}}
> struct Incomplete; // expected-note{{forward}}
>
> @@ -7,3 +9,20 @@ void test_f1(Incomplete *incomplete_p, i
> f1(int_p);
> f1(incomplete_p); // expected-note{{instantiation of}}
> }
> +#endif
> +
> +template<typename T> void f(void (*p)() throw(T)) {
> +#ifdef ERRORS
> + void (*q)() throw(char) = p; // expected-error {{target exception spec}}
> +
> + extern void (*p2)() throw(T);
> + void (*q2)() throw(char) = p2; // expected-error {{target exception spec}}
> +
> + extern void (*p3)() throw(char);
> + void (*q3)() throw(T) = p3; // expected-error {{target exception spec}}
> +
> + void (*q4)() throw(T) = p2; // ok
> +#endif
> + p();
> +}
> +void g() { f<int>(0); } // expected-note {{instantiation of}}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list