summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp12
-rw-r--r--clang/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp8
-rw-r--r--clang/test/CXX/basic/basic.scope/basic.scope.local/p2.cpp10
3 files changed, 22 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 8a40a2e15a8..36e353e8953 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -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) {
diff --git a/clang/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp b/clang/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp
index 7df0f536cf0..c59c4a550d7 100644
--- a/clang/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp
+++ b/clang/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp
@@ -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
+ };
+}
diff --git a/clang/test/CXX/basic/basic.scope/basic.scope.local/p2.cpp b/clang/test/CXX/basic/basic.scope/basic.scope.local/p2.cpp
index 7c7b84d6782..1b4199155fa 100644
--- a/clang/test/CXX/basic/basic.scope/basic.scope.local/p2.cpp
+++ b/clang/test/CXX/basic/basic.scope/basic.scope.local/p2.cpp
@@ -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
+ }
+}
OpenPOWER on IntegriCloud