forked from OSchip/llvm-project
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:
parent
1d1c4fb81c
commit
9ef622e5bf
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue