Index: lib/StaticAnalyzer/Checkers/Checkers.td
===================================================================
--- lib/StaticAnalyzer/Checkers/Checkers.td	(revision 179267)
+++ lib/StaticAnalyzer/Checkers/Checkers.td	(working copy)
@@ -207,6 +207,9 @@
   HelpText<"Check unreachable code">,
   DescFile<"UnreachableCodeChecker.cpp">;

+def UnaryPlusWithUnsignedChecker : Checker<"UnaryPlusWithUnsigned">,
+  HelpText<"Checks if a 'unary +' is used on an unsigned type">,
+  DescFile<"UnaryPlusUnsignedChecker.cpp">;
 } // end "alpha.deadcode"

 //===----------------------------------------------------------------------===//
Index: lib/StaticAnalyzer/Checkers/CMakeLists.txt
===================================================================
--- lib/StaticAnalyzer/Checkers/CMakeLists.txt	(revision 179267)
+++ lib/StaticAnalyzer/Checkers/CMakeLists.txt	(working copy)
@@ -61,6 +61,7 @@
   StreamChecker.cpp
   TaintTesterChecker.cpp
   TraversalChecker.cpp
+  UnaryPlusUnsignedChecker.cpp
   UndefBranchChecker.cpp
   UndefCapturedBlockVarChecker.cpp
   UndefResultChecker.cpp
Index: lib/StaticAnalyzer/Checkers/UnaryPlusUnsignedChecker.cpp
===================================================================
--- lib/StaticAnalyzer/Checkers/UnaryPlusUnsignedChecker.cpp	(revision 0)
+++ lib/StaticAnalyzer/Checkers/UnaryPlusUnsignedChecker.cpp	(working copy)
@@ -0,0 +1,75 @@
+//== UnaryPlusUnsignedChecker.cpp - Unary Plus Unsigned Checker -*- 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 defines a check for use of unary '+' on an unsigned type.
+///
+//===----------------------------------------------------------------------===//
+
+#include "ClangSACheckers.h"
+#include "clang/AST/StmtVisitor.h"
+#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
+#include "clang/StaticAnalyzer/Core/Checker.h"
+#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
+
+using namespace clang;
+using namespace ento;
+
+namespace {
+class WalkAst : public StmtVisitor<WalkAst> {
+public:
+  WalkAst(BugReporter &BR_, AnalysisDeclContext *AC_) : BR(BR_), AC(AC_) {}
+  void VisitChildren(Stmt *S);
+  void VisitStmt(Stmt *S);
+  void VisitUnaryOperator(UnaryOperator *U);
+private:
+  BugReporter &BR;
+  AnalysisDeclContext *AC;
+};
+}
+
+void WalkAst::VisitChildren(Stmt *S) {
+  for (Stmt::child_iterator I = S->child_begin(), End = S->child_end();
+       I != End; ++I) {
+    if (Stmt *Child = *I)
+      Visit(Child);
+  }
+}
+
+void WalkAst::VisitStmt(Stmt *S) { VisitChildren(S); }
+
+void WalkAst::VisitUnaryOperator(UnaryOperator *U) {
+  if (U->getOpcode() != UO_Plus || !U->getType()->isUnsignedIntegerType())
+    return;
+
+  // If we get here, we known there is a 'unary +' on unsigned,
+  // so report a bug.
+  SourceRange Range = U->getSourceRange();
+  PathDiagnosticLocation Loc =
+      PathDiagnosticLocation::createBegin(U, BR.getSourceManager(), AC);
+  BR.EmitBasicReport(
+      AC->getDecl(), "Potential dead use of 'unary +' on unsigned type",
+      "Dead Code",
+      "'unary +' is used on an unsigned type, which may be dead code.",
+      Loc, &Range, 1);
+}
+
+namespace {
+class UnaryPlusUnsignedChecker : public Checker<check::ASTCodeBody> {
+public:
+  void
+  checkASTCodeBody(const Decl *D, AnalysisManager &mgr, BugReporter &BR) const {
+    WalkAst walk(BR, mgr.getAnalysisDeclContext(D));
+    walk.Visit(D->getBody());
+  }
+};
+}
+
+void ento::registerUnaryPlusWithUnsignedChecker(CheckerManager &mgr) {
+  mgr.registerChecker<UnaryPlusUnsignedChecker>();
+}
Index: test/Analysis/unary-plus.c
===================================================================
--- test/Analysis/unary-plus.c	(revision 0)
+++ test/Analysis/unary-plus.c	(working copy)
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.deadcode.UnaryPlusWithUnsigned -verify %s
+
+unsigned foo() {
+  return 0;
+}
+
+int main() {
+  unsigned i = 0;
+  int j = 0;
+  j = +i; // expected-warning{{'unary +' is used on an unsigned type, which may be dead code}}
+
+  i = +j; // no-warning
+
+  int a = +foo(); // expected-warning{{'unary +' is used on an unsigned type, which may be dead code}}
+  int b = foo(); // no-warning
+}
