[clang-tools-extra] r179127 - Adding the AddOverride transform for cpp11-migrate

Edwin Vane edwin.vane at intel.com
Tue Apr 9 13:49:50 PDT 2013


Author: revane
Date: Tue Apr  9 15:49:49 2013
New Revision: 179127

URL: http://llvm.org/viewvc/llvm-project?rev=179127&view=rev
Log:
Adding the AddOverride transform for cpp11-migrate

This transform adds the override specifier to methods that overrides virtual
methods from a base class that don't already have this specifier.

Author: Philip Dunstan <phil at phildunstan.com>

Added:
    clang-tools-extra/trunk/cpp11-migrate/AddOverride/
    clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.cpp
    clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.h
    clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideActions.cpp
    clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideActions.h
    clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideMatchers.cpp
    clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideMatchers.h
    clang-tools-extra/trunk/docs/AddOverrideTransform.rst
    clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/
    clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/basic.cpp
    clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/comment_before_inline_body_fail.cpp
Modified:
    clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt
    clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp
    clang-tools-extra/trunk/cpp11-migrate/tool/Makefile
    clang-tools-extra/trunk/docs/cpp11-migrate.rst

Added: clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.cpp?rev=179127&view=auto
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.cpp (added)
+++ clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.cpp Tue Apr  9 15:49:49 2013
@@ -0,0 +1,63 @@
+//===-- AddOverride/AddOverride.cpp - add C++11 override -------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file provides the implementation of the AddOverrideTransform
+/// class.
+///
+//===----------------------------------------------------------------------===//
+
+#include "AddOverride.h"
+#include "AddOverrideActions.h"
+#include "AddOverrideMatchers.h"
+#include "clang/Frontend/FrontendActions.h"
+#include "clang/Rewrite/Core/Rewriter.h"
+#include "clang/Tooling/Refactoring.h"
+#include "clang/Tooling/Tooling.h"
+
+using clang::ast_matchers::MatchFinder;
+using namespace clang::tooling;
+using namespace clang;
+
+int AddOverrideTransform::apply(const FileContentsByPath &InputStates,
+                                RiskLevel MaxRisk,
+                                const CompilationDatabase &Database,
+                                const std::vector<std::string> &SourcePaths,
+                                FileContentsByPath &ResultStates) {
+  RefactoringTool AddOverrideTool(Database, SourcePaths);
+
+  for (FileContentsByPath::const_iterator I = InputStates.begin(),
+       E = InputStates.end();
+       I != E; ++I) {
+    AddOverrideTool.mapVirtualFile(I->first, I->second);
+  }
+
+  unsigned AcceptedChanges = 0;
+
+  MatchFinder Finder;
+  AddOverrideFixer Fixer(AddOverrideTool.getReplacements(), AcceptedChanges);
+
+  Finder.addMatcher(makeCandidateForOverrideAttrMatcher(), &Fixer);
+
+  if (int result = AddOverrideTool.run(newFrontendActionFactory(&Finder))) {
+    llvm::errs() << "Error encountered during translation.\n";
+    return result;
+  }
+
+  RewriterContainer Rewrite(AddOverrideTool.getFiles(), InputStates);
+
+  // FIXME: Do something if some replacements didn't get applied?
+  AddOverrideTool.applyAllReplacements(Rewrite.getRewriter());
+
+  collectResults(Rewrite.getRewriter(), InputStates, ResultStates);
+
+  setAcceptedChanges(AcceptedChanges);
+
+  return 0;
+}

Added: clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.h?rev=179127&view=auto
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.h (added)
+++ clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.h Tue Apr  9 15:49:49 2013
@@ -0,0 +1,37 @@
+//===-- AddOverride/AddOverride.h - add C++11 override ---------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file provides the definition of the AddOverrideTransform
+/// class which is the main interface to the transform that tries to add
+/// the override keyword to declarations of member function that override
+/// virtual functions in a base class.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_H
+#define LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_H
+
+#include "Core/Transform.h"
+#include "llvm/Support/Compiler.h"
+
+/// \brief Subclass of Transform that adds the C++11 override keyword to
+/// member functions overriding base class virtual functions.
+class AddOverrideTransform : public Transform {
+public:
+  AddOverrideTransform() : Transform("AddOverride") {}
+
+  /// \see Transform::run().
+  virtual int apply(const FileContentsByPath &InputStates,
+                    RiskLevel MaxRiskLEvel,
+                    const clang::tooling::CompilationDatabase &Database,
+                    const std::vector<std::string> &SourcePaths,
+                    FileContentsByPath &ResultStates) LLVM_OVERRIDE;
+};
+
+#endif // LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_H

Added: clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideActions.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideActions.cpp?rev=179127&view=auto
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideActions.cpp (added)
+++ clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideActions.cpp Tue Apr  9 15:49:49 2013
@@ -0,0 +1,59 @@
+//===-- AddOverride/AddOverrideActions.cpp - add C++11 override-*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+///  \file
+///  \brief This file contains the definition of the AddOverrideFixer class
+///  which is used as an ASTMatcher callback.
+///
+//===----------------------------------------------------------------------===//
+
+#include "AddOverrideActions.h"
+#include "AddOverrideMatchers.h"
+
+#include "clang/Basic/CharInfo.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/Attr.h"
+#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/Lex/Lexer.h"
+
+using namespace clang::ast_matchers;
+using namespace clang::tooling;
+using namespace clang;
+
+void AddOverrideFixer::run(const MatchFinder::MatchResult &Result) {
+  SourceManager &SM = *Result.SourceManager;
+
+  const CXXMethodDecl *M = Result.Nodes.getDeclAs<CXXMethodDecl>(MethodId);
+  assert(M && "Bad Callback. No node provided");
+
+  // First check that there isn't already an override attribute.
+  if (!M->hasAttr<OverrideAttr>()) {
+    if (M->getLocStart().isFileID()) {
+      SourceLocation StartLoc;
+      if (M->hasInlineBody()) {
+        // Start at the beginning of the body and rewind back to the last
+        // non-whitespace character. We will insert the override keyword
+        // after that character.
+        // FIXME: This transform won't work if there is a comment between
+        // the end of the function prototype and the start of the body.
+        StartLoc = M->getBody()->getLocStart();
+        do {
+          StartLoc = StartLoc.getLocWithOffset(-1);
+        } while (isWhitespace(*FullSourceLoc(StartLoc, SM).getCharacterData()));
+        StartLoc = StartLoc.getLocWithOffset(1);
+      } else {
+        StartLoc = SM.getSpellingLoc(M->getLocEnd());
+        StartLoc = Lexer::getLocForEndOfToken(StartLoc, 0, SM, LangOptions());
+      }
+      Replace.insert(tooling::Replacement(SM, StartLoc, 0, " override"));
+      ++AcceptedChanges;
+    }
+  }
+}
+

Added: clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideActions.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideActions.h?rev=179127&view=auto
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideActions.h (added)
+++ clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideActions.h Tue Apr  9 15:49:49 2013
@@ -0,0 +1,38 @@
+//===-- AddOverride/AddOverrideActions.h - add C++11 override --*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+///  \file
+///  \brief This file contains the declaration of the AddOverrideFixer class
+///  which is used as a ASTMatcher callback.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_ACTIONS_H
+#define LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_ACTIONS_H
+
+#include "Core/Transform.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/Tooling/Refactoring.h"
+
+/// \brief The callback to be used for add-override migration matchers.
+///
+class AddOverrideFixer : public clang::ast_matchers::MatchFinder::MatchCallback {
+public:
+  AddOverrideFixer(clang::tooling::Replacements &Replace,
+                   unsigned &AcceptedChanges) :
+    Replace(Replace), AcceptedChanges(AcceptedChanges) {}
+
+  /// \brief Entry point to the callback called when matches are made.
+  virtual void run(const clang::ast_matchers::MatchFinder::MatchResult &Result);
+
+private:
+  clang::tooling::Replacements &Replace;
+  unsigned &AcceptedChanges;
+};
+
+#endif // LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_ACTIONS_H

Added: clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideMatchers.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideMatchers.cpp?rev=179127&view=auto
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideMatchers.cpp (added)
+++ clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideMatchers.cpp Tue Apr  9 15:49:49 2013
@@ -0,0 +1,28 @@
+//===-- AddOverride/AddOverrideMatchers.cpp - C++11 override ---*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+///  \file
+///  \brief This file contains the definitions for matcher-generating functions
+///  and a custom AST_MATCHER for identifying casts of type CK_NullTo*.
+///
+//===----------------------------------------------------------------------===//
+#include "AddOverrideMatchers.h"
+#include "clang/AST/ASTContext.h"
+
+using namespace clang::ast_matchers;
+using namespace clang;
+
+const char *MethodId = "method";
+
+DeclarationMatcher makeCandidateForOverrideAttrMatcher() {
+  return methodDecl(hasParent(recordDecl()),
+                    isOverride(),
+                    unless(destructorDecl())).bind(MethodId);
+}
+

Added: clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideMatchers.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideMatchers.h?rev=179127&view=auto
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideMatchers.h (added)
+++ clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverrideMatchers.h Tue Apr  9 15:49:49 2013
@@ -0,0 +1,27 @@
+//===-- AddOverride/AddOverrideMatchers.h - add C++11 override -*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+///  \file
+///  \brief This file contains the declarations for matcher-generating functions
+///  and names for bound nodes found by AST matchers.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_MATCHERS_H
+#define LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_MATCHERS_H
+
+#include "clang/ASTMatchers/ASTMatchers.h"
+
+/// Name to bind with matched expressions.
+extern const char *MethodId;
+
+/// \brief Create a matcher that finds member function declarations that are
+/// candidates for adding the override attribute.
+clang::ast_matchers::DeclarationMatcher makeCandidateForOverrideAttrMatcher();
+
+#endif // LLVM_TOOLS_CLANG_TOOLS_EXTRA_CPP11_MIGRATE_ADD_OVERRIDE_MATCHERS_H

Modified: clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt?rev=179127&r1=179126&r2=179127&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt Tue Apr  9 15:49:49 2013
@@ -16,6 +16,9 @@ list(APPEND Cpp11MigrateSources ${UseNul
 file(GLOB_RECURSE UseAutoSources "../UseAuto/*.cpp")
 list(APPEND Cpp11MigrateSources ${UseAutoSources})
 
+file(GLOB_RECURSE AddOverrideSources "../AddOverride/*.cpp")
+list(APPEND Cpp11MigrateSources ${AddOverrideSources})
+
 add_clang_executable(cpp11-migrate
   ${Cpp11MigrateSources}
   )

Modified: clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp?rev=179127&r1=179126&r2=179127&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp Tue Apr  9 15:49:49 2013
@@ -20,6 +20,7 @@
 #include "LoopConvert/LoopConvert.h"
 #include "UseNullptr/UseNullptr.h"
 #include "UseAuto/UseAuto.h"
+#include "AddOverride/AddOverride.h"
 #include "clang/Frontend/FrontendActions.h"
 #include "clang/Tooling/CommonOptionsParser.h"
 #include "clang/Tooling/Tooling.h"
@@ -71,6 +72,9 @@ int main(int argc, const char **argv) {
   TransformManager.registerTransform(
       "use-auto", "Use of 'auto' type specifier",
       &ConstructTransform<UseAutoTransform>);
+  TransformManager.registerTransform(
+      "add-override", "Make use of override specifier where possible",
+      &ConstructTransform<AddOverrideTransform>);
   // Add more transform options here.
 
   // This causes options to be parsed.

Modified: clang-tools-extra/trunk/cpp11-migrate/tool/Makefile
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Makefile?rev=179127&r1=179126&r2=179127&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/tool/Makefile (original)
+++ clang-tools-extra/trunk/cpp11-migrate/tool/Makefile Tue Apr  9 15:49:49 2013
@@ -29,6 +29,8 @@ SOURCES += $(addprefix ../UseNullptr/,$(
 BUILT_SOURCES += $(ObjDir)/../UseNullptr/.objdir
 SOURCES += $(addprefix ../UseAuto/,$(notdir $(wildcard $(PROJ_SRC_DIR)/../UseAuto/*.cpp)))
 BUILT_SOURCES += $(ObjDir)/../UseAuto/.objdir
+SOURCES += $(addprefix ../AddOverride/,$(notdir $(wildcard $(PROJ_SRC_DIR)/../AddOverride/*.cpp)))
+BUILT_SOURCES += $(ObjDir)/../AddOverride/.objdir
 
 LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader support mc
 USEDLIBS = clangTooling.a clangFrontend.a clangSerialization.a clangDriver.a \

Added: clang-tools-extra/trunk/docs/AddOverrideTransform.rst
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/AddOverrideTransform.rst?rev=179127&view=auto
==============================================================================
--- clang-tools-extra/trunk/docs/AddOverrideTransform.rst (added)
+++ clang-tools-extra/trunk/docs/AddOverrideTransform.rst Tue Apr  9 15:49:49 2013
@@ -0,0 +1,47 @@
+.. index:: Add-Override Transform
+
+======================
+Add-Override Transform
+======================
+
+The Add-Override Transform adds the ``override`` specifier to member
+functions that override a virtual function in a base class and that
+don't already have the specifier. The transform is enabled with the 
+:option:`-add-override` option of :program:`cpp11-migrate`.
+For example:
+
+.. code-block:: c++
+
+  class A {
+  public:
+    virtual void h() const;
+  };
+
+  class B : public A {
+  public:
+    void h() const;
+
+    // The declaration of h is transformed to
+    void h() const override;
+  };
+
+
+Known Limitations
+-----------------
+* This transform will fail if a method declaration has an inlined method
+  body and there is a comment between the method declaration and the body.
+  In this case, the override keyword will incorrectly be inserted at the 
+  end of the comment.
+
+.. code-block:: c++
+
+  class B : public A {
+  public:
+    virtual void h() const // comment
+    { }
+
+    // The declaration of h is transformed to
+    virtual void h() const // comment override
+    { }
+  };
+

Modified: clang-tools-extra/trunk/docs/cpp11-migrate.rst
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/cpp11-migrate.rst?rev=179127&r1=179126&r2=179127&view=diff
==============================================================================
--- clang-tools-extra/trunk/docs/cpp11-migrate.rst (original)
+++ clang-tools-extra/trunk/docs/cpp11-migrate.rst Tue Apr  9 15:49:49 2013
@@ -10,6 +10,7 @@ cpp11-migrate User's Manual
    UseAutoTransform
    UseNullptrTransform
    LoopConvertTransform
+   AddOverrideTransform
 
 :program:`cpp11-migrate` is a standalone tool used to automatically convert
 C++98 and C++03 code to use features of the new C++11 standard where
@@ -51,6 +52,13 @@ Command Line Options
   Replace the type specifier of variable declarations with the ``auto`` type
   specifier. See :doc:`UseAutoTransform`.
 
+.. option:: -add-override
+
+  Adds the override specifier to member functions where it is appropriate. That
+  is, the override specifier is added to member functions that override a
+  virtual function in a base class and that don't already have the specifier.
+  See :doc:`AddOverrideTransform`.
+
 .. option:: -p=<build-path>
 
   ``<build-path>`` is a CMake build directory containing a file named

Added: clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/basic.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/basic.cpp?rev=179127&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/basic.cpp (added)
+++ clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/basic.cpp Tue Apr  9 15:49:49 2013
@@ -0,0 +1,110 @@
+// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
+// RUN: cpp11-migrate -add-override %t.cpp -- -I %S -std=c++11
+// RUN: FileCheck -input-file=%t.cpp %s
+
+class A {
+public:
+  virtual ~A();
+  // CHECK: virtual ~A();
+  void f();
+  virtual void h() const;
+  // CHECK: virtual void h() const;
+  virtual void i() = 0;
+  // CHECK: virtual void i() = 0;
+};
+
+// Test that override isn't added to non-virtual functions.
+class B : public A {
+public:
+  void f();
+  // CHECK: class B
+  // CHECK: void f();
+};
+
+// Test that override is added to functions that override virtual functions.
+class C : public A {
+public:
+  void h() const;
+  // CHECK: class C
+  // CHECK: void h() const override;
+};
+
+// Test that override isn't add to functions that overload but not override.
+class D : public A {
+public:
+  void h();
+  // CHECK: class D
+  // CHECK: void h();
+};
+
+// Test that override isn't added again to functions that already have it.
+class E : public A {
+public:
+  void h() const override;
+  // CHECK: class E
+  // CHECK: void h() const override;
+};
+
+// Test that override isn't added to the destructor.
+class F : public A {
+public:
+  virtual ~F();
+  // CHECK: class F
+  // CHECK: virtual ~F();
+};
+
+// Test that override is placed before any end of line comments.
+class G : public A {
+public:
+  void h() const; // comment
+  // CHECK: class G
+  // CHECK: void h() const override; // comment
+};
+
+// Test that override is placed correctly if there is an inline body.
+class H : public A {
+public:
+  void h() const { }
+  // CHECK: class H
+  // CHECK: void h() const override { }
+};
+
+// Test that override is placed correctly if there is a body on the next line.
+class I : public A {
+public:
+  void h() const
+  { }
+  // CHECK: class I
+  // CHECK: void h() const override
+  // CHECK: { }
+};
+
+// Test that override is placed correctly if there is a body outside the class.
+class J : public A {
+public:
+  void h() const;
+  // CHECK: class J
+  // CHECK: void h() const override;
+};
+
+void J::h() const {
+  // CHECK: void J::h() const {
+}
+
+// Test that override is placed correctly if there is a trailing return type.
+class K : public A {
+public:
+  auto h() const -> void;
+  // CHECK: class K
+  // CHECK: auto h() const -> void override;
+};
+
+// Test that override isn't added if it is already specified via a macro.
+class L : public A {
+public:
+#define LLVM_OVERRIDE override
+  void h() const LLVM_OVERRIDE;
+  // CHECK: class L
+  // CHECK: void h() const LLVM_OVERRIDE;
+};
+

Added: clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/comment_before_inline_body_fail.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/comment_before_inline_body_fail.cpp?rev=179127&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/comment_before_inline_body_fail.cpp (added)
+++ clang-tools-extra/trunk/test/cpp11-migrate/AddOverride/comment_before_inline_body_fail.cpp Tue Apr  9 15:49:49 2013
@@ -0,0 +1,25 @@
+// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
+// RUN: cpp11-migrate -add-override %t.cpp -- -I %S
+// RUN: FileCheck -input-file=%t.cpp %s
+// XFAIL: *
+
+class A {
+public:
+  virtual void h() const;
+  // CHECK: virtual void h() const;
+};
+
+// Test that the override is correctly placed if there
+// is an inline comment between the function declaration
+// and the function body.
+// This test fails with the override keyword being added
+// to the end of the comment. This failure occurs because
+// the insertion point is incorrectly calculated if there
+// is an inline comment before the method body.
+class B : public A {
+public:
+  virtual void h() const // comment
+  { }
+  // CHECK: virtual void h() const override
+};
+





More information about the cfe-commits mailing list