adek05 updated this revision to Diff 44598.
adek05 added a comment.

Adding testcases in unittest/AST/SourceLocationTest.cpp as suggested by 
@aaronballman

Interestingly, without my change tests for function declarations pass. Only 
member functions fail:

  tools/clang/unittests/AST/ASTTests
  ...
  [----------] 2 tests from FunctionDecl
  [ RUN      ] FunctionDecl.FunctionDeclWithThrowSpecification
  [       OK ] FunctionDecl.FunctionDeclWithThrowSpecification (17 ms)
  [ RUN      ] FunctionDecl.FunctionDeclWithNoExceptSpecification
  [       OK ] FunctionDecl.FunctionDeclWithNoExceptSpecification (10 ms)
  [----------] 2 tests from FunctionDecl (27 ms total)
  
  [----------] 2 tests from CXXMethodDecl
  [ RUN      ] CXXMethodDecl.CXXMethodDeclWithThrowSpecification
  /Users/adek/llvm-git/tools/clang/unittests/AST/SourceLocationTest.cpp:569: 
Failure
  Value of: Verifier.match( "class A {\n" "void f() throw();\n" "};\n", 
functionDecl())
    Actual: false (Expected range <2:1-2:16>, found 
<input.cc:2:1-input.cc:2:17>)
  Expected: true
  [  FAILED  ] CXXMethodDecl.CXXMethodDeclWithThrowSpecification (10 ms)
  [ RUN      ] CXXMethodDecl.CXXMethodDeclWithNoExceptSpecification
  /Users/adek/llvm-git/tools/clang/unittests/AST/SourceLocationTest.cpp:580: 
Failure
  Value of: Verifier.match( "class A {\n" "void f() noexcept(false);\n" "};\n", 
functionDecl(), Language::Lang_CXX11)
    Actual: false (Expected range <2:1-2:24>, found 
<input.cc:2:1-input.cc:2:25>)
  Expected: true
  [  FAILED  ] CXXMethodDecl.CXXMethodDeclWithNoExceptSpecification (10 ms)
  [----------] 2 tests from CXXMethodDecl (20 ms total)

Not sure why would they take different codepaths, throw and noexcept are 
C++(11) specific. Is the code parsed as C++11 anyway for Verifiers?


http://reviews.llvm.org/D15443

Files:
  lib/Parse/ParseDeclCXX.cpp
  unittests/AST/SourceLocationTest.cpp

Index: unittests/AST/SourceLocationTest.cpp
===================================================================
--- unittests/AST/SourceLocationTest.cpp
+++ unittests/AST/SourceLocationTest.cpp
@@ -542,5 +542,43 @@
       cxxConstructExpr(), Lang_OBJCXX));
 }
 
+TEST(FunctionDecl, FunctionDeclWithThrowSpecification) {
+  RangeVerifier<FunctionDecl> Verifier;
+  Verifier.expectRange(1, 1, 1, 16);
+  EXPECT_TRUE(Verifier.match(
+      "void f() throw();\n",
+      functionDecl()));
+}
+
+TEST(FunctionDecl, FunctionDeclWithNoExceptSpecification) {
+  RangeVerifier<FunctionDecl> Verifier;
+  Verifier.expectRange(1, 1, 1, 24);
+  EXPECT_TRUE(Verifier.match(
+      "void f() noexcept(false);\n",
+      functionDecl(),
+      Language::Lang_CXX11));
+}
+
+TEST(CXXMethodDecl, CXXMethodDeclWithThrowSpecification) {
+  RangeVerifier<FunctionDecl> Verifier;
+  Verifier.expectRange(2, 1, 2, 16);
+  EXPECT_TRUE(Verifier.match(
+      "class A {\n"
+      "void f() throw();\n"
+      "};\n",
+      functionDecl()));
+}
+
+TEST(CXXMethodDecl, CXXMethodDeclWithNoExceptSpecification) {
+  RangeVerifier<FunctionDecl> Verifier;
+  Verifier.expectRange(2, 1, 2, 24);
+  EXPECT_TRUE(Verifier.match(
+      "class A {\n"
+      "void f() noexcept(false);\n"
+      "};\n",
+      functionDecl(),
+      Language::Lang_CXX11));
+}
+
 } // end namespace ast_matchers
 } // end namespace clang
Index: lib/Parse/ParseDeclCXX.cpp
===================================================================
--- lib/Parse/ParseDeclCXX.cpp
+++ lib/Parse/ParseDeclCXX.cpp
@@ -3358,7 +3358,8 @@
     ConsumeAndStoreUntil(tok::r_paren, *ExceptionSpecTokens,
                          /*StopAtSemi=*/true,
                          /*ConsumeFinalToken=*/true);
-    SpecificationRange.setEnd(Tok.getLocation());
+    SpecificationRange.setEnd(ExceptionSpecTokens->back().getLocation());
+
     return EST_Unparsed;
   }
   


Index: unittests/AST/SourceLocationTest.cpp
===================================================================
--- unittests/AST/SourceLocationTest.cpp
+++ unittests/AST/SourceLocationTest.cpp
@@ -542,5 +542,43 @@
       cxxConstructExpr(), Lang_OBJCXX));
 }
 
+TEST(FunctionDecl, FunctionDeclWithThrowSpecification) {
+  RangeVerifier<FunctionDecl> Verifier;
+  Verifier.expectRange(1, 1, 1, 16);
+  EXPECT_TRUE(Verifier.match(
+      "void f() throw();\n",
+      functionDecl()));
+}
+
+TEST(FunctionDecl, FunctionDeclWithNoExceptSpecification) {
+  RangeVerifier<FunctionDecl> Verifier;
+  Verifier.expectRange(1, 1, 1, 24);
+  EXPECT_TRUE(Verifier.match(
+      "void f() noexcept(false);\n",
+      functionDecl(),
+      Language::Lang_CXX11));
+}
+
+TEST(CXXMethodDecl, CXXMethodDeclWithThrowSpecification) {
+  RangeVerifier<FunctionDecl> Verifier;
+  Verifier.expectRange(2, 1, 2, 16);
+  EXPECT_TRUE(Verifier.match(
+      "class A {\n"
+      "void f() throw();\n"
+      "};\n",
+      functionDecl()));
+}
+
+TEST(CXXMethodDecl, CXXMethodDeclWithNoExceptSpecification) {
+  RangeVerifier<FunctionDecl> Verifier;
+  Verifier.expectRange(2, 1, 2, 24);
+  EXPECT_TRUE(Verifier.match(
+      "class A {\n"
+      "void f() noexcept(false);\n"
+      "};\n",
+      functionDecl(),
+      Language::Lang_CXX11));
+}
+
 } // end namespace ast_matchers
 } // end namespace clang
Index: lib/Parse/ParseDeclCXX.cpp
===================================================================
--- lib/Parse/ParseDeclCXX.cpp
+++ lib/Parse/ParseDeclCXX.cpp
@@ -3358,7 +3358,8 @@
     ConsumeAndStoreUntil(tok::r_paren, *ExceptionSpecTokens,
                          /*StopAtSemi=*/true,
                          /*ConsumeFinalToken=*/true);
-    SpecificationRange.setEnd(Tok.getLocation());
+    SpecificationRange.setEnd(ExceptionSpecTokens->back().getLocation());
+
     return EST_Unparsed;
   }
   
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to