The exception-declaration for a function-try-block cannot redeclare a

function parameter. One of our existing test cases was XFAILed because
of this. This fixes the issue and un-XFAILs the test.

llvm-svn: 210026
This commit is contained in:
Aaron Ballman 2014-06-02 13:10:07 +00:00
parent 1d1c4fb81c
commit 9ef622e5bf
3 changed files with 22 additions and 8 deletions

View File

@ -11353,13 +11353,17 @@ Decl *Sema::ActOnExceptionDeclarator(Scope *S, Declarator &D) {
LookupOrdinaryName,
ForRedeclaration)) {
// The scope should be freshly made just for us. There is just no way
// it contains any previous declaration.
// it contains any previous declaration, except for function parameters in
// a function-try-block's catch statement.
assert(!S->isDeclScope(PrevDecl));
if (PrevDecl->isTemplateParameter()) {
if (isDeclInScope(PrevDecl, CurContext, S)) {
Diag(D.getIdentifierLoc(), diag::err_redefinition)
<< D.getIdentifier();
Diag(PrevDecl->getLocation(), diag::note_previous_definition);
Invalid = true;
} else if (PrevDecl->isTemplateParameter())
// Maybe we will complain about the shadowed template parameter.
DiagnoseTemplateParameterShadow(D.getIdentifierLoc(), PrevDecl);
PrevDecl = nullptr;
}
}
if (D.getCXXScopeSpec().isSet() && !Invalid) {

View File

@ -1,5 +1,4 @@
// RUN: %clang_cc1 -fexceptions -fcxx-exceptions -fsyntax-only -verify %s
// XFAIL: *
class C {
public:
@ -10,8 +9,13 @@ C::C(int a, // expected-note {{previous definition}}
int b) // expected-note {{previous definition}}
try {
int c;
} catch (int a) { // expected-error {{redefinition of 'a'}}
int b; // expected-error {{redefinition of 'b'}}
++c; // expected-error {{use of undeclared identifier 'c'}}
}
void f(int i) {
struct S {
void g() try {} catch (int i) {}; // OK
};
}

View File

@ -9,8 +9,8 @@ void func2(int i) try { // expected-note{{previous definition is here}}
} catch (...) {
}
void func3(int i) try { // FIXME: note {{previous definition is here}}
} catch (int i) { // FIXME: error {{redefinition of 'i'}}
void func3(int i) try { // expected-note {{previous definition is here}}
} catch (int i) { // expected-error {{redefinition of 'i'}}
}
void func4(int i) try { // expected-note{{previous definition is here}}
@ -58,3 +58,9 @@ void func10() {
int b; // FIXME: decide whether this is valid
}
}
void func11(int a) {
try {
} catch (int a) { // OK
}
}