]> granicus.if.org Git - clang/commit
Implement DR1330 in C++11 mode, to support libstdc++4.7 which uses it.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 17 Apr 2012 00:58:00 +0000 (00:58 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 17 Apr 2012 00:58:00 +0000 (00:58 +0000)
commite6975e9b0985ad7f7ff9187e38d95bfe9ac4181b
treec68d347ef93340e9e17ee01fc56755561260b697
parent7fea7c81c0970cdb150c1fadb2776dec9fd09780
Implement DR1330 in C++11 mode, to support libstdc++4.7 which uses it.

We have a new flavor of exception specification, EST_Uninstantiated. A function
type with this exception specification carries a pointer to a FunctionDecl, and
the exception specification for that FunctionDecl is instantiated (if needed)
and used in the place of the function type's exception specification.

When a function template declaration with a non-trivial exception specification
is instantiated, the specialization's exception specification is set to this
new 'uninstantiated' kind rather than being instantiated immediately.

Expr::CanThrow has migrated onto Sema, so it can instantiate exception specs
on-demand. Also, any odr-use of a function triggers the instantiation of its
exception specification (the exception specification could be needed by IRGen).
In passing, fix two places where a DeclRefExpr was created but the corresponding
function was not actually marked odr-used. We used to get away with this, but
don't any more.

Also fix a bug where instantiating an exception specification which refers to
function parameters resulted in a crash. We still have the same bug in default
arguments, which I'll be looking into next.

This, plus a tiny patch to fix libstdc++'s common_type, is enough for clang to
parse (and, in very limited testing, support) all of libstdc++4.7's standard
headers.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154886 91177308-0d34-0410-b5e6-96231b3b80d8
21 files changed:
include/clang/AST/Expr.h
include/clang/AST/Type.h
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Basic/ExceptionSpecificationType.h
include/clang/Sema/Sema.h
lib/AST/ASTContext.cpp
lib/AST/Expr.cpp
lib/AST/Type.cpp
lib/Analysis/CFG.cpp
lib/Sema/SemaDeclCXX.cpp
lib/Sema/SemaExceptionSpec.cpp
lib/Sema/SemaExpr.cpp
lib/Sema/SemaExprCXX.cpp
lib/Sema/SemaOverload.cpp
lib/Sema/SemaTemplateInstantiate.cpp
lib/Sema/SemaTemplateInstantiateDecl.cpp
lib/Sema/TreeTransform.h
test/CXX/except/except.spec/p1.cpp
test/CodeGenCXX/cxx11-exception-spec.cpp [new file with mode: 0644]
test/SemaTemplate/instantiate-declref.cpp
test/SemaTemplate/instantiate-exception-spec-cxx11.cpp [new file with mode: 0644]