From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29334 invoked by alias); 17 Oct 2008 21:38:25 -0000 Received: (qmail 29315 invoked by uid 22791); 17 Oct 2008 21:38:23 -0000 X-Spam-Check-By: sourceware.org Received: from wa-out-1112.google.com (HELO wa-out-1112.google.com) (209.85.146.182) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 17 Oct 2008 21:37:32 +0000 Received: by wa-out-1112.google.com with SMTP id m28so409180wag.8 for ; Fri, 17 Oct 2008 14:37:30 -0700 (PDT) Received: by 10.115.74.16 with SMTP id b16mr3699790wal.129.1224279450000; Fri, 17 Oct 2008 14:37:30 -0700 (PDT) Received: by 10.114.61.13 with HTTP; Fri, 17 Oct 2008 14:37:29 -0700 (PDT) Message-ID: <24b520d20810171437sa477249sc6860cff7c0670c6@mail.gmail.com> Date: Sat, 18 Oct 2008 02:27:00 -0000 From: "Doug Gregor" To: "Gcc Patch List" , libstdc++ Subject: [v3] Fix C++0x pair constructors MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_43206_9325892.1224279449990" Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2008-10/txt/msg00766.txt.bz2 ------=_Part_43206_9325892.1224279449990 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 1974 The attached patch fixes the infamous "null pointer" problem that Sylvain Pion found with the C++0x pair constructors: #include int main() { std::pair p (0,0); } The problem here is that the variadic constructor for the C++0x pair turned the 0's into "int" values, and char* can't be initialized by an int. So, this valid C++98 code fails to compile in C++0x. This patch fixes that issue. Working around this problem requires some extra pair constructors, some enable_if magic, and Peter Dimov's cool trick of using enable_if in the default template argument of a constructor template. The basic idea is simple: use enable_if to steer the compiler away from any constructors that might try to initialize a pointer with an integral type. Instead, provide similar constructors that don't template that argument, so that the compiler will convert the null pointer constant to the pointer's type outside of the pair constructor. The details are a little messy, because we need to make sure there's always a correct fallback when the enable_if fails. I thought there was a bug in Bugzilla where Sylvain reported this problem, but I wasn't able to find it. This is exactly the problem reported in LWG issue 811, which was resolved by the concepts proposal. This patch is, effectively, trying to mimic what concepts would do anyway. Tested i686-pc-linux-gnu; no regressions. - Doug 2008-10-17 Douglas Gregor * include/bits/stl_pair.h (__may_be_null_pointer_init): New. (pair::pair): Eliminate the redundant pair(U1&&, U2&&) constructor. Add lvalue pair constructor to handle non-const pair lvalues. Remove the old variadic constructor, and instead provide several variadic constructors that avoid failing when attempting to initialize a pointer from a null pointer constant. * testsuite/20_util/pair/moveable.cc (test3): Add new tests with initialization of pointers from the null pointer constant. ------=_Part_43206_9325892.1224279449990 Content-Type: text/x-patch; name=pair-null-pointer-fix.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fmfbq7200 Content-Disposition: attachment; filename=pair-null-pointer-fix.patch Content-length: 8284 SW5kZXg6IGluY2x1ZGUvYml0cy9zdGxfcGFpci5oCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KLS0tIGluY2x1ZGUvYml0cy9zdGxfcGFpci5oCShyZXZpc2lv biAxNDExMDkpCisrKyBpbmNsdWRlL2JpdHMvc3RsX3BhaXIuaAkod29ya2lu ZyBjb3B5KQpAQCAtNjUsOCArNjUsMzUgQEAKICNpbmNsdWRlIDxiaXRzL21v dmUuaD4gLy8gZm9yIHN0ZDo6bW92ZSAvIHN0ZDo6Zm9yd2FyZCwgc3RkOjpk ZWNheSwgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZDo6c3dh cAogCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18KKyNpbmNs dWRlIDx0eXBlX3RyYWl0cz4KKyNlbmRpZgorCiBfR0xJQkNYWF9CRUdJTl9O QU1FU1BBQ0Uoc3RkKQogCisjaWZkZWYgX19HWFhfRVhQRVJJTUVOVEFMX0NY WDBYX18KKy8vIEEgdHJhaXQgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhl IGluaXRpYWxpemF0aW9uIG9mIGEgVCBmcm9tCisvLyBhcmd1bWVudHMgb2Yg dHlwZSBBcmdzIGNvdWxkIHBvc3NpYmx5IGJlIHRoZSBpbml0aWFsaXphdGlv biBvZiBhCisvLyBwb2ludGVyIGZyb20gYSBudWxsIHBvaW50ZXIgY29uc3Rh bnQuCit0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWUuLi4+CitzdHJ1Y3Qg X19tYXlfYmVfbnVsbF9wb2ludGVyX2luaXQgCisgIDogcHVibGljIGZhbHNl X3R5cGUgeyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfVHAsIHR5cGVuYW1l IF9VcD4KK3N0cnVjdCBfX21heV9iZV9udWxsX3BvaW50ZXJfaW5pdDxfVHAq LCBfVXA+ICAKKyAgOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwK KyAgICAgICAgICAgICAoaXNfaW50ZWdyYWw8dHlwZW5hbWUgcmVtb3ZlX3Jl ZmVyZW5jZTxfVXA+Ojp0eXBlPjo6dmFsdWUgCisgICAgICAgICAgICAgIHx8 IGlzX2VudW08dHlwZW5hbWUgcmVtb3ZlX3JlZmVyZW5jZTxfVXA+Ojp0eXBl Pjo6dmFsdWUpPiAKKyAgeyB9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBfQ2xh c3MsIHR5cGVuYW1lIF9UcCwgdHlwZW5hbWUgX1VwPgorc3RydWN0IF9fbWF5 X2JlX251bGxfcG9pbnRlcl9pbml0PF9UcCBfQ2xhc3M6OiosIF9VcD4gIAor ICA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAg ICAgIChpc19pbnRlZ3JhbDx0eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9V cD46OnR5cGU+Ojp2YWx1ZSAKKyAgICAgICAgICAgICAgfHwgaXNfZW51bTx0 eXBlbmFtZSByZW1vdmVfcmVmZXJlbmNlPF9VcD46OnR5cGU+Ojp2YWx1ZSk+ IAorICB7IH07CisjZW5kaWYKKwogICAvLy8gcGFpciBob2xkcyB0d28gb2Jq ZWN0cyBvZiBhcmJpdHJhcnkgdHlwZS4KICAgdGVtcGxhdGU8Y2xhc3MgX1Qx LCBjbGFzcyBfVDI+CiAgICAgc3RydWN0IHBhaXIKQEAgLTg5LDEwICsxMTYs MTIgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFKHN0ZCkKICAgICAgIDog Zmlyc3QoX19hKSwgc2Vjb25kKF9fYikgeyB9CiAKICNpZmRlZiBfX0dYWF9F WFBFUklNRU5UQUxfQ1hYMFhfXwotICAgICAgdGVtcGxhdGU8Y2xhc3MgX1Ux LCBjbGFzcyBfVTI+Ci0gICAgICAgIHBhaXIoX1UxJiYgX194LCBfVTImJiBf X3kpCi0JOiBmaXJzdChzdGQ6OmZvcndhcmQ8X1UxPihfX3gpKSwKLQkgIHNl Y29uZChzdGQ6OmZvcndhcmQ8X1UyPihfX3kpKSB7IH0KKyAgICAgIC8vIE9t aXR0ZWQgdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3Rvciwgd2hpY2ggYXBwZWFy cyBpbiB0aGUgQysrMHgKKyAgICAgIC8vIHdvcmtpbmcgcGFwZXIgYnV0IGlz IHJlZHVuZGFudCB3aXRoIHRoZSB2YXJpYWRpYyBjb25zdHJ1Y3RvcnMKKyAg ICAgIC8vIGJlbG93LgorICAgICAgLy8KKyAgICAgIC8vICAgdGVtcGxhdGU8 Y2xhc3MgX1UxLCBjbGFzcyBfVTI+CisgICAgICAvLyAgICAgcGFpcihfVTEm JiBfX3gsIF9VMiYmIF9feSk7CiAKICAgICAgIHBhaXIocGFpciYmIF9fcCkK ICAgICAgIDogZmlyc3Qoc3RkOjptb3ZlKF9fcC5maXJzdCkpLApAQCAtMTEx LDEyICsxNDAsNTYgQEAgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFKHN0ZCkK IAk6IGZpcnN0KHN0ZDo6bW92ZShfX3AuZmlyc3QpKSwKIAkgIHNlY29uZChz dGQ6Om1vdmUoX19wLnNlY29uZCkpIHsgfQogCi0gICAgICAvLyBodHRwOi8v Z2NjLmdudS5vcmcvbWwvbGlic3RkYysrLzIwMDctMDgvbXNnMDAwNTIuaHRt bAotICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfQXJnMCwgY2xh c3MuLi4gX0FyZ3M+Ci0gICAgICAgIHBhaXIoX1UxJiYgX194LCBfQXJnMCYm IF9fYXJnMCwgX0FyZ3MmJi4uLiBfX2FyZ3MpCisgICAgICAvLyBUaGlzIGNv bnN0cnVjdG9yIGlzIHJlcXVpcmVkIHNvIHRoYXQgbHZhbHVlIHBhaXJzIGRv bid0IGdldAorICAgICAgLy8gcHVzaGVkIHRvIHRoZSB2YXJpYWRpYyBjb25z dHJ1Y3RvciBiZWxvdy4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xh c3MgX1UyPgorICAgICAgICBwYWlyKHBhaXI8X1UxLCBfVTI+JiBfX3ApCisg ICAgICAgICAgOiBmaXJzdChjb25zdF9jYXN0PGNvbnN0IHBhaXI8X1UxLCBf VTI+Jj4oX19wKS5maXJzdCksCisgIAkgICAgc2Vjb25kKGNvbnN0X2Nhc3Q8 Y29uc3QgcGFpcjxfVTEsIF9VMj4mPihfX3ApLnNlY29uZCkgeyB9CisKKyAg ICAgIC8vIF9HTElCQ1hYX1JFU09MVkVfTElCX0RFRkVDVFMKKyAgICAgIC8v IDgxMS4gIHBhaXIgb2YgcG9pbnRlcnMgbm8gbG9uZ2VyIHdvcmtzIHdpdGgg bGl0ZXJhbCAwCisKKyAgICAgIC8vIFZhcmlhZGljIGNvbnN0cnVjdG9yLiBU aGUgZW5hYmxlX2lmIG1ha2VzIHN1cmUgdGhhdCB3ZSB3b24ndAorICAgICAg Ly8gdHJ5IHRvIGluaXRpYWxpemUgYSBwb2ludGVyIGZyb20gYW4gaW50ZWdy YWwgdHlwZSwgd2hpY2gKKyAgICAgIC8vIG5lZWRzIHRvIGJlIGhhbmRsZWQg YnkgYSBkaWZmZXJlbnQgY29uc3RydWN0b3IgdGhhdCB3aWxsCisgICAgICAv LyBjb252ZXJ0IGEgbnVsbCBwb2ludGVyIGNvbnN0YW50IHRvIHRoYXQgcG9p bnRlciB0eXBlLiBTZWUKKyAgICAgIC8vIGxpYnJhcnkgaXNzdWUgNzY3Lgor ICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcy4uLiBfQXJncywKKyAg ICAgICAgY2xhc3MgX0NoZWNrZXIgCisgICAgICAgICAgPSB0eXBlbmFtZSBl bmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgICghX19tYXlfYmVf bnVsbF9wb2ludGVyX2luaXQ8X1QxLCBfVTE+Ojp2YWx1ZQorICAgICAgICAg ICAgICAgICAgICAgICAgJiYgIV9fbWF5X2JlX251bGxfcG9pbnRlcl9pbml0 PF9UMiwgX0FyZ3MuLi4+Ojp2YWx1ZSksIAorICAgICAgICAgICAgICAgICAg ICAgdm9pZD46OnR5cGU+CisgICAgICAgIHBhaXIoX1UxJiYgX194LCBfQXJn cyYmLi4uIF9fYXJncykKKwk6IGZpcnN0KHN0ZDo6Zm9yd2FyZDxfVTE+KF9f eCkpLAorCSAgc2Vjb25kKHN0ZDo6Zm9yd2FyZDxfQXJncz4oX19hcmdzKS4u LikgeyB9CisKKyAgICAgIC8vIFZhcmlhZGljIGNvbnN0cnVjdG9yLiBUaGUg ZW5hYmxlX2lmIG1ha2VzIHN1cmUgdGhhdCB0aGUKKyAgICAgIC8vIHNlY29u ZCBhcmd1bWVudCBpc24ndCBnb2luZyB0byB0cnkgdG8gaW5pdGlhbGl6ZSBh IHBvaW50ZXIKKyAgICAgIC8vIGZyb20gYW4gaW50ZWdyYWwgdHlwZS4gSG93 ZXZlciwgVDEgbWF5IGJlIGEgcG9pbnRlciB3aG9zZQorICAgICAgLy8gYXJn dW1lbnQgd2FzIGEgbnVsbCBwb2ludGVyIGNvbnN0YW50LgorICAgICAgdGVt cGxhdGU8Y2xhc3MuLi4gX0FyZ3MsCisgICAgICAgIGNsYXNzIF9DaGVja2Vy IAorICAgICAgICAgID0gdHlwZW5hbWUgZW5hYmxlX2lmPAorICAgICAgICAg ICAgICAgICAgICAgICAhX19tYXlfYmVfbnVsbF9wb2ludGVyX2luaXQ8X1Qy LCBfQXJncy4uLj46OnZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgIHZv aWQ+Ojp0eXBlPgorICAgICAgICBwYWlyKGNvbnN0IF9UMSYgX194LCBfQXJn cyYmLi4uIF9fYXJncykKKwk6IGZpcnN0KF9feCksCisJICBzZWNvbmQoc3Rk Ojpmb3J3YXJkPF9BcmdzPihfX2FyZ3MpLi4uKSB7IH0KKworICAgICAgLy8g Q29uc3RydWN0b3IgdHlwaWNhbGx5IHVzZWQgd2hlbiBUMiBpcyBhIHBvaW50 ZXIgYW5kIHRoZQorICAgICAgLy8gc2Vjb25kIGFyZ3VtZW50IHdhcyBhIG51 bGwgcG9pbnRlciBjb25zdGFudC4gVGhlIGVuYWJsZV9pZgorICAgICAgLy8g bWFrZXMgc3VyZSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBpc24ndCBnb2lu ZyB0byB0cnkgdG8KKyAgICAgIC8vIGluaXRpYWxpemUgYSBwb2ludGVyIGZy b20gYW4gaW50ZWdyYWwgdHlwZS4KKyAgICAgIHRlbXBsYXRlPGNsYXNzIF9V MSwKKyAgICAgICAgY2xhc3MgX0NoZWNrZXIgCisgICAgICAgICAgPSB0eXBl bmFtZSBlbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAhX19tYXlf YmVfbnVsbF9wb2ludGVyX2luaXQ8X1QxLCBfVTE+Ojp2YWx1ZSwKKyAgICAg ICAgICAgICAgICAgICAgIHZvaWQ+Ojp0eXBlPgorICAgICAgICBwYWlyKF9V MSYmIF9feCwgY29uc3QgX1QyJiBfX3kpCiAJOiBmaXJzdChzdGQ6OmZvcndh cmQ8X1UxPihfX3gpKSwKLQkgIHNlY29uZChzdGQ6OmZvcndhcmQ8X0FyZzA+ KF9fYXJnMCksCi0JCSBzdGQ6OmZvcndhcmQ8X0FyZ3M+KF9fYXJncykuLi4p IHsgfQorCSAgc2Vjb25kKF9feSkgeyB9CiAKICAgICAgIHBhaXImCiAgICAg ICBvcGVyYXRvcj0ocGFpciYmIF9fcCkKSW5kZXg6IHRlc3RzdWl0ZS8yMF91 dGlsL3BhaXIvbW92ZWFibGUuY2MKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gdGVzdHN1aXRlLzIwX3V0aWwvcGFpci9tb3ZlYWJsZS5jYwkocmV2aXNp b24gMTQxMTA5KQorKysgdGVzdHN1aXRlLzIwX3V0aWwvcGFpci9tb3ZlYWJs ZS5jYwkod29ya2luZyBjb3B5KQpAQCAtNjQsOSArNjQsNTQgQEAgdGVzdDIo KQogICAgICAgICAgci5zZWNvbmQuc2l6ZSgpID09IDIgJiYgcC5zZWNvbmQu c2l6ZSgpID09IDApOwogfQogCitzdHJ1Y3QgWCB7IAorICBleHBsaWNpdCBY KGludCwgaW50KSB7IH0KKworcHJpdmF0ZToKKyAgWChjb25zdCBYJikgPSBk ZWxldGU7Cit9OworCitzdHJ1Y3QgbW92ZV9vbmx5IHsKKyAgbW92ZV9vbmx5 KCkgeyB9CisgIG1vdmVfb25seShtb3ZlX29ubHkmJikgeyB9CisKK3ByaXZh dGU6CisgIG1vdmVfb25seShjb25zdCBtb3ZlX29ubHkmKSA9IGRlbGV0ZTsK K307CisKK3ZvaWQKK3Rlc3QzKCkKK3sKKyAgaW50ICppcCA9IDA7CisgIGlu dCBYOjoqbXAgPSAwOworICBzdGQ6OnBhaXI8aW50KiwgaW50Kj4gcDEoMCwg MCk7CisgIHN0ZDo6cGFpcjxpbnQqLCBpbnQqPiBwMihpcCwgMCk7CisgIHN0 ZDo6cGFpcjxpbnQqLCBpbnQqPiBwMygwLCBpcCk7CisgIHN0ZDo6cGFpcjxp bnQqLCBpbnQqPiBwNChpcCwgaXApOworCisgIHN0ZDo6cGFpcjxpbnQgWDo6 KiwgaW50Kj4gcDUoMCwgMCk7CisgIHN0ZDo6cGFpcjxpbnQgWDo6KiwgaW50 IFg6Oio+IHA2KG1wLCAwKTsKKyAgc3RkOjpwYWlyPGludCBYOjoqLCBpbnQg WDo6Kj4gcDcoMCwgbXApOworICBzdGQ6OnBhaXI8aW50IFg6OiosIGludCBY OjoqPiBwOChtcCwgbXApOworCisgIHN0ZDo6cGFpcjxpbnQqLCBYPiBwOSgw LCAxLCAyKTsKKyAgc3RkOjpwYWlyPGludCBYOjoqLCBYPiBwMTAoMCwgMSwg Mik7CisgIHN0ZDo6cGFpcjxpbnQqLCBYPiBwMTEoaXAsIDEsIDIpOworICBz dGQ6OnBhaXI8aW50IFg6OiosIFg+IHAxMihtcCwgMSwgMik7CisKKyAgc3Rk OjpwYWlyPGludCosIG1vdmVfb25seT4gcDEzKDApOworICBzdGQ6OnBhaXI8 aW50IFg6OiosIG1vdmVfb25seT4gcDE0KDApOworCisgIHN0ZDo6cGFpcjxp bnQqLCBtb3ZlX29ubHk+IHAxNSgwLCBtb3ZlX29ubHkoKSk7CisgIHN0ZDo6 cGFpcjxpbnQgWDo6KiwgbW92ZV9vbmx5PiBwMTYoMCwgbW92ZV9vbmx5KCkp OworICBzdGQ6OnBhaXI8bW92ZV9vbmx5LCBpbnQqPiBwMTcobW92ZV9vbmx5 KCksIDApOworICBzdGQ6OnBhaXI8bW92ZV9vbmx5LCBpbnQgWDo6Kj4gcDE4 KG1vdmVfb25seSgpLCAwKTsKK30KKwogaW50IAogbWFpbigpIAogewogICB0 ZXN0MSgpOwogICB0ZXN0MigpOworICB0ZXN0MygpOwogfQo= ------=_Part_43206_9325892.1224279449990--