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