From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22953 invoked by alias); 7 Apr 2003 10:46:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 22926 invoked by uid 71); 7 Apr 2003 10:46:02 -0000 Resent-Date: 7 Apr 2003 10:46:02 -0000 Resent-Message-ID: <20030407104602.22925.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, igusarov@mail.ru Received: (qmail 22703 invoked by uid 48); 7 Apr 2003 10:45:17 -0000 Message-Id: <20030407104517.22702.qmail@sources.redhat.com> Date: Mon, 07 Apr 2003 10:46:00 -0000 From: igusarov@mail.ru Reply-To: igusarov@mail.ru To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/10332: Template classes are not instantiated correctly in presense of #pragma pack() X-SW-Source: 2003-04/txt/msg00239.txt.bz2 List-Id: >Number: 10332 >Category: c++ >Synopsis: Template classes are not instantiated correctly in presense of #pragma pack() >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Mon Apr 07 10:46:02 UTC 2003 >Closed-Date: >Last-Modified: >Originator: Akella corp. >Release: 3.2 >Organization: >Environment: System: FreeBSD gate.studio1001.akella.ru 4.4-RELEASE FreeBSD 4.4-RELEASE #11: Thu Jun 6 12:58:54 host: i386-unknown-freebsd4.4 build: i386-unknown-freebsd4.4 target: i386-unknown-freebsd4.4 configured with: /usr/src/gcc-3.2/configure --prefix=/usr >Description: The packing size used for class template instantiation is set by the #pragma pack directive which is in effect at the point of template instantiation (whether implicit or explicit), rather then by the #pragma pack directive which was in effect at the point of class template definition. This is not a correct behaviour, because in a complex program it's hard to control the point of implicit instantiation of any given template class. And the wrong packing size is leading to incorrect code generation if a given template class was instantiadet with different packing sizes in different translation units. Consider the code examples in Howtorepeat section. Related problem reports: other/4957 >How-To-Repeat: 1. Try to compile and run the following example (all code examples in this report could be compiled with "g++ file.cpp", no special command-line options are required) //---------------------------- begin example #include #pragma pack(4) template struct T { char x1; /* Usually 3 padding bytes are added after x1 member. */ int x2; }; #pragma pack(1) template T; /* T is instantiated here */ #pragma pack(4) template T; /* T is instantiated here */ int main() { printf("sizeof T = %d\n", sizeof(T)); printf("sizeof T = %d\n", sizeof(T)); } //---------------------------- end example (parameter types 'int' and 'float' are not used in any way, they are required just to separate two template instances) The output is: sizeof T = 5 sizeof T = 8 Which shows that the size (and member offsets) of the template class depends on the #pragma pack at place of instantiation. 2. There is a more complicated example which shows how to trigger this bug accidently. Unpack the attached archive and compile two sample translation units (tu01.cpp and tu02.cpp) in alignment_bug/case_02 directory. The only difference between these translation units is the order of #include directives which causes different implicit instantiation of the same template class (include guards are skipped in such simple case). This test case repeats the behaviour reported in other/4957. >Fix: Do not rely on implicit instantiation. Instantiate all desired template classes explicitly (sic!). >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/x-compressed; name="alignment_bug_02.tgz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="alignment_bug_02.tgz" H4sIAGdSkT4AA+1ZXWvbMBTNs3/FJWWQlJFa8hcsXWHsuWywFvYwKIqtJGb+wpa7eqX/fVe2kziJ s4zNdVir85BE0tW9cq7Psa7FAn8RhTwSd7N8cTF4FoCpO5YFAwDiWER+I/T6u26AY5smNR3LsdCM Og4dgPU8y9lGngmWAgz8RZ6xNL4/ZPdjyXnQx4L6BdvKv8syfqeTju+DP8+/RQhx0Mwkjq7y3wfa 888fWJgEfOImSQcxiK5jcg/n37acFf8x7xTNbJMYA9A7iH0Urzz/Z37kBrnH4TITnh9Plleadpak bBEySJj7fWSONU1wvBuYQCNRJDxiIYevcKVlIs1dATfaoybT6C7lHynxQKb4eXEOt1nOgqAAA315 nh8tYFYIngFLOWAH94DNBU9xAoQ8nPF0AucXpTM/EvXd8UCn2tN0Z1VkvFnUzSUaX9URqwb4GXrA zEbCRxMPlhwjouu9a2t4mQcxk35KL1XjsB+5vpD50Wgsrz5JsT0fDTP/J4/nq0UAvIc33rdo+Baq gVE1MB5PW6bUEfenVANy0pPWef7b+E9Pqf+UlPpvm0r/+0B7/kWuk47Ef3Bc/6ltrPOPpmhmWSZR +t8HWvR/3TUMCzdgWTZZDrVGr09kR6NNdwzCIhYolJu5vxPL0XXxSVp/lNbjPfnbGi0lsHsNfM04 yH96Iv4TWvLfcBT/+8Df8J/u8J8o/v+3aOf/OvGdxDjGf2Kt+a9TYsj6T7ctxf8+0FbarSu766Lk 3U59h9XdVokmC7StcWNn3KwKuFNfqkILDvG/qeD/GuMY/8Gma/4TU77/cwgxFf/7wIbqm+esBu8g yWeB764UoHxtgTKgaPzS0M5/uaXrLsZR/lvr9z+6I3+jCOjq+d8LcG8e+BHX7mPf0+ZxPGoyHj6k C7llV5vuF4sD/Kd98p8a5ob/Rnn+56j6vx/snqqUWz587H/GNve+lJuDev/fOOAB8OoioHFQg51Y Cax6papUvdvO9gUGHp/KAmHv2OnU/42CgoKCgsJLxS9RufPqACgAAA==