clang generally doesn't try to partially analyze expressions of dependent type, so we don't do any analysis on e.g. "T* x = 0;". To put it another way, clang doesn't bother to distinguish between "T* x = 0" and "T x = 0;". The general case is rather complicated, and there isn't usually any benefit.
-Eli On Wed, Nov 28, 2012 at 10:22 AM, Edwin Vane <[email protected]> wrote: > > So I tried looking for ImplicitCastExpr where the CastKind was > CK_NullToPointer or CK_NullToMemberPointer. This does handle most of the > cases with a single simple matcher. However, there are two test of my test > cases failing: > > int *p; > p = static_cast<T*>(reinterpret_cast<int*>((void*)NULL)); > // CHECK: p = nullptr; > > template <typename T> > struct Bar { > Bar(T *p = NULL) : m_p(p) { > // CHECK: Bar(T *p = nullptr) : m_p(p) { > > In the first case, the NULL gets replaced but the explicit casts do not. > This is expected given the simple matcher. I expect the fix here is to match > all cast expressions and use Expr::isNullPointerConstant(). > > The second case doesn't work because there's no implicit cast involved. > Looking at the AST dump I see this: > > template <typename T = int> struct Bar { > struct Bar; > Bar(int *p) : m_p((ImplicitCastExpr 0x428fad8 <basic.cpp:67:26> 'int *' > <LValueToRValue> > (DeclRefExpr 0x428fa80 <col:26> 'int *' lvalue ParmVar 0x428e880 'p' 'int > *')) > > and > > template <typename T> struct Bar { > struct Bar; > Bar<T>(T *p = (IntegerLiteral 0x428c550 <basic.cpp:7:14> 'int' 0) > ) : m_p((DeclRefExpr 0x428c598 <basic.cpp:67:26> 'T *' lvalue ParmVar > 0x4284e00 'p' 'T *') > > It seems to me that in this template case, there should be an implicit cast > since we know T* will be some sort of pointer type. Is that a bug or > something I just have to live with? > > http://llvm-reviews.chandlerc.com/D136 > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
