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

Aaron Ballman aaron at aaronballman.com
Mon Jun 2 06:10:07 PDT 2014


Author: aaronballman
Date: Mon Jun  2 08:10:07 2014
New Revision: 210026

URL: http://llvm.org/viewvc/llvm-project?rev=210026&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/Sema/SemaDeclCXX.cpp
    cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp
    cfe/trunk/test/CXX/basic/basic.scope/basic.scope.local/p2.cpp

Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=210026&r1=210025&r2=210026&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Mon Jun  2 08:10:07 2014
@@ -11353,13 +11353,17 @@ Decl *Sema::ActOnExceptionDeclarator(Sco
                                              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) {

Modified: cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp?rev=210026&r1=210025&r2=210026&view=diff
==============================================================================
--- cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp (original)
+++ cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p15.cpp Mon Jun  2 08:10:07 2014
@@ -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
      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
+  };
+}

Modified: cfe/trunk/test/CXX/basic/basic.scope/basic.scope.local/p2.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/basic/basic.scope/basic.scope.local/p2.cpp?rev=210026&r1=210025&r2=210026&view=diff
==============================================================================
--- cfe/trunk/test/CXX/basic/basic.scope/basic.scope.local/p2.cpp (original)
+++ cfe/trunk/test/CXX/basic/basic.scope/basic.scope.local/p2.cpp Mon Jun  2 08:10:07 2014
@@ -9,8 +9,8 @@ void func2(int i) try { // expected-note
 } 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
+  }
+}





More information about the cfe-commits mailing list