[clang-tools-extra] r177168 - Prevent nullptr_t-typed exprs from being replaced

Edwin Vane edwin.vane at intel.com
Fri Mar 15 11:10:07 PDT 2013


Author: revane
Date: Fri Mar 15 13:10:07 2013
New Revision: 177168

URL: http://llvm.org/viewvc/llvm-project?rev=177168&view=rev
Log:
Prevent nullptr_t-typed exprs from being replaced

The Use-Nullptr transform was replacing nullptr_t-typed expressions because in
the AST such expressions have an implicit NullToPointer cast around them. Now
the transform ignores these expressions.

Fixes PR15414.

Modified:
    clang-tools-extra/trunk/cpp11-migrate/UseNullptr/NullptrMatchers.cpp
    clang-tools-extra/trunk/test/cpp11-migrate/UseNullptr/nullptr_t.cpp

Modified: clang-tools-extra/trunk/cpp11-migrate/UseNullptr/NullptrMatchers.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/UseNullptr/NullptrMatchers.cpp?rev=177168&r1=177167&r2=177168&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/UseNullptr/NullptrMatchers.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/UseNullptr/NullptrMatchers.cpp Fri Mar 15 13:10:07 2013
@@ -37,17 +37,40 @@ AST_MATCHER(CastExpr, isNullToPointer) {
     Node.getCastKind() == CK_NullToMemberPointer;
 }
 
+AST_MATCHER(Type, sugaredNullptrType) {
+  const Type *DesugaredType = Node.getUnqualifiedDesugaredType();
+  if (const BuiltinType *BT = dyn_cast<BuiltinType>(DesugaredType))
+    return BT->getKind() == BuiltinType::NullPtr;
+  return false;
+}
+
 } // end namespace ast_matchers
 } // end namespace clang
 
 StatementMatcher makeImplicitCastMatcher() {
-  return implicitCastExpr(allOf(unless(hasAncestor(explicitCastExpr())),
-                                isNullToPointer())).bind(ImplicitCastNode);
+  return implicitCastExpr(
+           isNullToPointer(),
+           unless(hasAncestor(explicitCastExpr())),
+           unless(
+             hasSourceExpression(
+               hasType(sugaredNullptrType())
+             )
+           )
+         ).bind(ImplicitCastNode);
 }
 
 StatementMatcher makeCastSequenceMatcher() {
   return explicitCastExpr(
-            allOf(unless(hasAncestor(explicitCastExpr())),
-                  hasDescendant(implicitCastExpr(isNullToPointer())))
-            ).bind(CastSequence);
+           unless(hasAncestor(explicitCastExpr())),
+           hasDescendant(
+             implicitCastExpr(
+               isNullToPointer(),
+               unless(
+                 hasSourceExpression(
+                   hasType(sugaredNullptrType())
+                 )
+               )
+             )
+           )
+         ).bind(CastSequence);
 }

Modified: clang-tools-extra/trunk/test/cpp11-migrate/UseNullptr/nullptr_t.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp11-migrate/UseNullptr/nullptr_t.cpp?rev=177168&r1=177167&r2=177168&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/cpp11-migrate/UseNullptr/nullptr_t.cpp (original)
+++ clang-tools-extra/trunk/test/cpp11-migrate/UseNullptr/nullptr_t.cpp Fri Mar 15 13:10:07 2013
@@ -1,17 +1,29 @@
 // RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
 // RUN: cpp11-migrate -final-syntax-check -use-nullptr %t.cpp -- --std=c++11 -I %S
 // RUN: FileCheck -input-file=%t.cpp %s
-// XFAIL: *
 
-namespace std { typedef decltype(nullptr) nullptr_t; }
+namespace std {
+
+typedef decltype(nullptr) nullptr_t;
+
+} // namespace std
 
 // Just to make sure make_null() could have side effects.
 void external();
 
-std::nullptr_t make_null() { external(); return nullptr; }
+std::nullptr_t make_null() {
+  external();
+  return nullptr;
+}
+
+void func() {
+  void *CallTest = make_null();
+  // CHECK: void *CallTest = make_null();
+
+  int var = 1;
+  void *CommaTest = (var+=2, make_null());
+  // CHECK: void *CommaTest = (var+=2, make_null());
 
-void *call_make_null()
-{
-  return make_null();
-  // CHECK: return make_null();
+  int *CastTest = static_cast<int*>(make_null());
+  // CHECK: int *CastTest = static_cast<int*>(make_null());
 }





More information about the cfe-commits mailing list