summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ASTContext.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-03-03 01:50:05 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-03-03 01:50:05 +0000
commitd09a51c299ab277119b2e96b26ed9864c6404ebe (patch)
treeea05b065457d4b843e712b0964d957df7914a85c /clang/lib/AST/ASTContext.cpp
parent786ad180496d20cf224ba30b25a754cc2d934b2b (diff)
downloadbcm5719-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.cpp13
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,
OpenPOWER on IntegriCloud