LLVM is a robust system, particularly well suited for developing new mid-level language-independent analyses and optimizations.

LLVMプロジェクトのブログに、「C++11 Migrator」と呼ばれる現在開発が進められている新機能の紹介記事が掲載された。C++11 Migratorは既存のC++のソースコードをC++11の機能を使ったソースコードへ変換するためのツール。2012年12月に提案されたプロジェクトで、現在開発段階にある。

C++11 Migratorの目的はソースコードをC++11の新機能を使った記述へ変更することで、C++ソースコードのメンテナンス性の引き上げ、読みやすさの向上、実行時のパフォーマンスの引き上げ、コンパイル時間の短縮、などを実現することにあると説明されている。

現段階で実装されている変換では、次のC++11の機能を使うように変換が実施される。

  • for繰り返し構文におけるレンジ指定記述
  • ヌルポインタとしてnullptr表記の使用
  • auto型指定
  • override指定

Status of the C++11 Migrator」には変換のサンプルも掲載されており、どのような変換が実施されるのかわかりやすい。一部抜粋すると次のとおり。

int arr[] = {1,2,3,4,5};
for (int i = 0; i < 5; ++i)
  llvm::outs() << arr[i];
↓
int arr[] = {1,2,3,4,5};
for (auto & elem : arr)
  llvm::outs() << elem;
forにおけるレンジ指定記述
int *IntPtr = 0;
float *FloatPtr = NULL;
foo(static_cast<int*>(0));
↓
int *IntPtr = nullptr;
float *FloatPtr = nullptr;
foo(static_cast<int*>(nullptr));
ヌルポインタとしてnullptr表記の使用
MyType *VarPtr = new MyType();
MyType * const VarCPtr = new MyType();
↓
auto VarPtr = new MyType();
auto const VarCPtr = new MyType();
auto型指定
class Parent {
public:
  virtual int getNumChildren();
};

class Child {
public:
  virtual int getNumChildren();
};
↓
class Parent {
public:
  virtual int getNumChildren();
};

class Child {
public:
  virtual int getNumChildren() override;
};
override指定

開発は今後も継続するとされており、バグ修正に取り組むと同時に、さらに多くの変換機能を追加するとしている。