aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-04-24 05:06:35 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-04-24 05:06:35 +0000
commit8c614e4f2b07741130e6c99a971a7093358fb9e4 (patch)
tree5823f01bc399ad4ae1b6dd756ae4715d6796fea6 /lib/Sema/SemaDeclCXX.cpp
parent88442c935d51f1d8981969e366706682c24ad691 (diff)
PR12629: Cope with parenthesized function types when attaching a delayed
exception specification to a function. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155424 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--lib/Sema/SemaDeclCXX.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index b6395f5dcb..8645de1fcd 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -11315,11 +11315,9 @@ void Sema::actOnDelayedExceptionSpecification(Decl *MethodD,
if (!Method)
return;
- // Dig out the prototype. This should never fail.
+ // Dig out the prototype, looking through only parens. This should never fail.
const FunctionProtoType *Proto
- = dyn_cast<FunctionProtoType>(Method->getType());
- if (!Proto)
- return;
+ = cast<FunctionProtoType>(Method->getType().IgnoreParens());
// Check the exception specification.
llvm::SmallVector<QualType, 4> Exceptions;
@@ -11332,6 +11330,12 @@ void Sema::actOnDelayedExceptionSpecification(Decl *MethodD,
Proto->arg_type_begin(),
Proto->getNumArgs(),
EPI);
+
+ // Rebuild any parens around the function type.
+ for (const ParenType *PT = dyn_cast<ParenType>(Method->getType()); PT;
+ PT = dyn_cast<ParenType>(PT->getInnerType()))
+ T = Context.getParenType(T);
+
if (TypeSourceInfo *TSInfo = Method->getTypeSourceInfo()) {
// FIXME: When we get proper type location information for exceptions,
// we'll also have to rebuild the TypeSourceInfo. For now, we just patch