[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