diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-03-03 01:50:05 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-03-03 01:50:05 +0000 |
commit | d09a51c299ab277119b2e96b26ed9864c6404ebe (patch) | |
tree | ea05b065457d4b843e712b0964d957df7914a85c /clang/lib/AST/ASTContext.cpp | |
parent | 786ad180496d20cf224ba30b25a754cc2d934b2b (diff) | |
download | bcm5719-llvm-d09a51c299ab277119b2e96b26ed9864c6404ebe.tar.gz bcm5719-llvm-d09a51c299ab277119b2e96b26ed9864c6404ebe.zip |
Sema: Properly initialize the thrown exception object
We would create the exception object with the wrong qualifiers, ensuring
that the wrong copy constructor would get called.
llvm-svn: 231049
Diffstat (limited to 'clang/lib/AST/ASTContext.cpp')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 8a99162c1cf..fc40f7e8e23 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -4338,6 +4338,19 @@ QualType ASTContext::getSignatureParameterType(QualType T) const { return T.getUnqualifiedType(); } +QualType ASTContext::getExceptionObjectType(QualType T) const { + // C++ [except.throw]p3: + // A throw-expression initializes a temporary object, called the exception + // object, the type of which is determined by removing any top-level + // cv-qualifiers from the static type of the operand of throw and adjusting + // the type from "array of T" or "function returning T" to "pointer to T" + // or "pointer to function returning T", [...] + T = getVariableArrayDecayedType(T); + if (T->isArrayType() || T->isFunctionType()) + T = getDecayedType(T); + return T.getUnqualifiedType(); +} + /// getArrayDecayedType - Return the properly qualified result of decaying the /// specified array type to a pointer. This operation is non-trivial when /// handling typedefs etc. The canonical type of "T" must be an array type, |