On Sat, Sep 7, 2013 at 1:40 PM, Richard Smith <[email protected]> wrote:
> On Sat, Sep 7, 2013 at 12:33 PM, David Majnemer > <[email protected]>wrote: > >> On Sat, Sep 7, 2013 at 10:35 AM, Richard Smith <[email protected]>wrote: >> >>> >>> On 7 Sep 2013 02:39, "David Majnemer" <[email protected]> wrote: >>> > >>> > Hi rsmith, rjmccall, eli.friedman, doug.gregor, >>> > >>> > We would previously treat nullptr literals as we were mangling the for >>> > the null pointer value of the template parameter's type instead. >>> > >>> > This fixes PR17141. >>> > >>> > http://llvm-reviews.chandlerc.com/D1625 >>> > >>> > Files: >>> > lib/AST/ItaniumMangle.cpp >>> > test/CodeGenCXX/mangle-nullptr-arg.cpp >>> > test/CodeGenCXX/visibility.cpp >>> > >>> > Index: lib/AST/ItaniumMangle.cpp >>> > =================================================================== >>> > --- lib/AST/ItaniumMangle.cpp >>> > +++ lib/AST/ItaniumMangle.cpp >>> > @@ -3337,10 +3337,8 @@ >>> > break; >>> > } >>> > case TemplateArgument::NullPtr: { >>> > - // <expr-primary> ::= L <type> 0 E >>> > - Out << 'L'; >>> > - mangleType(A.getNullPtrType()); >>> > - Out << "0E"; >>> > + // <expr-primary> ::= L <nullptr type> E >>> > + Out << "LDnE"; >>> > break; >>> > } >>> > case TemplateArgument::Pack: { >>> > Index: test/CodeGenCXX/mangle-nullptr-arg.cpp >>> > =================================================================== >>> > --- test/CodeGenCXX/mangle-nullptr-arg.cpp >>> > +++ test/CodeGenCXX/mangle-nullptr-arg.cpp >>> > @@ -2,15 +2,15 @@ >>> > >>> > template<int *ip> struct IP {}; >>> > >>> > -// CHECK-LABEL: define void @_Z5test12IPILPi0EE >>> > +// CHECK-LABEL: define void @_Z5test12IPILDnEE >>> > void test1(IP<nullptr>) {} >>> >>> The old mangling was correct here. >>> >>> > struct X{ }; >>> > template<int X::*pm> struct PM {}; >>> > >>> > -// CHECK-LABEL: define void @_Z5test22PMILM1Xi0EE >>> > +// CHECK-LABEL: define void @_Z5test22PMILDnEE >>> > void test2(PM<nullptr>) { } >>> >>> And here. You should only change the mangling of a null pointer of type >>> std::nullptr_t. >>> >> I considered only changing the mangling for std::nullptr_t type arguments >> but the following wording in the standard discouraged me: >> >> "The pointer literal nullptr is encoded as "LDnE"." >> >> I don't see where in the ABI we get the latitude to mangle this as-if it >> were (param-type)0. That said there are obvious problems with giving all of >> them the "LDnE" mangling. I will only use the different mangling for >> nullptr_t template parameters. >> > > Frequently the document lags behind discussion on cxx-abi-dev. The most > recent discussion on this is here: > > http://sourcerytools.com/pipermail/cxx-abi-dev/2011-August/002422.html > > The LDnE mangling was agreed over a year beforehand, here: > > http://sourcerytools.com/pipermail/cxx-abi-dev/2010-July/002353.html > > ... however, looking at that in more detail, it looks like all that was > agreed was that "nullptr" is mangled as LDnE as an expression, not > necessarily as a template argument. And it certainly makes sense to me to > use the L <type> 0 E mangling for all null pointer template arguments. > > >> Also, maybe this ABI break should be listed in the release notes. >> Will do. >> >>> Does GCC implement this rule yet? >>> >> They do not but icc 13.0.1 does. >> > > I'm now wondering if we and gcc are correct here, and EDG and icc are > wrong. Hopefully John can provide his interpretation :) > I think that you are right and that this is a defect in the specification. > > > -// CHECK-LABEL: define void @_Z5test316DependentTypePtrIPiLS0_0EE >>> > +// CHECK-LABEL: define void @_Z5test316DependentTypePtrIPiLDnEE >>> > template<typename T, T x> struct DependentTypePtr {}; >>> > void test3(DependentTypePtr<int*,nullptr>) { } >>> > Index: test/CodeGenCXX/visibility.cpp >>> > =================================================================== >>> > --- test/CodeGenCXX/visibility.cpp >>> > +++ test/CodeGenCXX/visibility.cpp >>> > @@ -971,8 +971,8 @@ >>> > void f() { >>> > zed<nullptr>(); >>> > } >>> > - // CHECK-LABEL: define internal void >>> @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv >>> > - // CHECK-HIDDEN-LABEL: define internal void >>> @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv >>> > + // CHECK-LABEL: define internal void @_ZN6test523zedILDnEEEvv >>> > + // CHECK-HIDDEN-LABEL: define internal void @_ZN6test523zedILDnEEEvv >>> > } >>> > >>> > namespace test53 { >>> >>
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
