• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1###########################################################################
2# Module for ABI Compliance Checker with regression test suite
3#
4# Copyright (C) 2009-2011 Institute for System Programming, RAS
5# Copyright (C) 2011-2012 Nokia Corporation and/or its subsidiary(-ies)
6# Copyright (C) 2011-2012 ROSA Laboratory
7# Copyright (C) 2012-2016 Andrey Ponomarenko's ABI Laboratory
8#
9# Written by Andrey Ponomarenko
10#
11# This program is free software: you can redistribute it and/or modify
12# it under the terms of the GNU General Public License or the GNU Lesser
13# General Public License as published by the Free Software Foundation.
14#
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18# GNU General Public License for more details.
19#
20# You should have received a copy of the GNU General Public License
21# and the GNU Lesser General Public License along with this program.
22# If not, see <http://www.gnu.org/licenses/>.
23###########################################################################
24use strict;
25
26my ($TestDump, $Debug, $Quiet, $ExtendedCheck, $LogMode, $ReportFormat,
27$DumpFormat, $LIB_EXT, $GCC_PATH, $SortDump, $CheckHeadersOnly,
28$OldStyle, $TestABIDumper);
29my $OSgroup = get_OSgroup();
30
31sub testTool($$$$$$$$$$$)
32{
33    ($TestDump, $Debug, $Quiet, $ExtendedCheck, $LogMode, $ReportFormat,
34    $DumpFormat, $LIB_EXT, $GCC_PATH, $SortDump, $CheckHeadersOnly,
35    $OldStyle, $TestABIDumper) = @_;
36
37    testC();
38    testCpp();
39}
40
41sub testCpp()
42{
43    printMsg("INFO", "verifying detectable C++ library changes");
44    my ($HEADER1, $SOURCE1, $HEADER2, $SOURCE2) = ();
45    my $DECL_SPEC = ($OSgroup eq "windows")?"__declspec( dllexport )":"";
46    my $EXTERN = ($OSgroup eq "windows")?"extern ":""; # add "extern" for CL compiler
47
48    # Class outside namespace
49    $HEADER1 .= "
50        class $DECL_SPEC OutsideNS {
51        public:
52            int someMethod();
53            int field;
54        };";
55    $SOURCE1 .= "
56        int OutsideNS::someMethod() { return 0; }";
57
58    $HEADER2 .= "
59        class $DECL_SPEC OutsideNS {
60        public:
61            int someMethod();
62            int field;
63            int field2;
64        };";
65    $SOURCE2 .= "
66        int OutsideNS::someMethod() { return 0; }";
67
68    # Begin namespace
69    $HEADER1 .= "namespace TestNS {\n";
70    $HEADER2 .= "namespace TestNS {\n";
71    $SOURCE1 .= "namespace TestNS {\n";
72    $SOURCE2 .= "namespace TestNS {\n";
73
74    # Changed template internals
75    # $HEADER1 .= "
76    #     template <typename T, int _P>
77    #     class $DECL_SPEC ChangedTemplate {
78    #     public:
79    #         T value;
80    #         T*const field;
81    #         T array[_P];
82    #         typedef int My;
83    #         My var;
84    #     };
85    #     ChangedTemplate<int, 1>* changedTemplate();";
86    # $SOURCE1 .= "
87    #     ChangedTemplate<int, 1>* changedTemplate() { return new ChangedTemplate<int, 1>(); }";
88    #
89    # $HEADER2 .= "
90    #     template <typename T, int _P>
91    #     class $DECL_SPEC ChangedTemplate {
92    #     public:
93    #         double value;
94    #         T* field;
95    #         double array[_P];
96    #         typedef int My;
97    #         My var;
98    #     };
99    #     ChangedTemplate<int, 1>* changedTemplate();";
100    # $SOURCE2 .= "
101    #     ChangedTemplate<int, 1>* changedTemplate() { return new ChangedTemplate<int, 1>(); }";
102
103    # Removed inline method
104    $HEADER1 .= "
105        class $DECL_SPEC RemovedInlineMethod {
106        public:
107            int someMethod();
108            inline int removedMethod() { return 0; };
109            int field;
110        };";
111    $SOURCE1 .= "
112        int RemovedInlineMethod::someMethod() { return removedMethod(); }";
113
114    $HEADER2 .= "
115        class $DECL_SPEC RemovedInlineMethod {
116        public:
117            int someMethod();
118            int field;
119        };";
120    $SOURCE2 .= "
121        int RemovedInlineMethod::someMethod() { return 0; }";
122
123    # Pure_Virtual_Replacement
124    $HEADER1 .= "
125        class $DECL_SPEC PureVirtualReplacement {
126        public:
127            virtual int methodOld(int param) = 0;
128            int otherMethod();
129        };
130
131        class $DECL_SPEC PureVirtualReplacement_Derived: public PureVirtualReplacement {
132        public:
133            int methodOld(int param);
134        };";
135    $SOURCE1 .= "
136        int PureVirtualReplacement::otherMethod() { return 0; }
137        int PureVirtualReplacement_Derived::methodOld(int param) { return 0; }";
138
139    $HEADER2 .= "
140        class $DECL_SPEC PureVirtualReplacement {
141        public:
142            virtual int methodNew(int param) = 0;
143            int otherMethod();
144        };
145
146        class $DECL_SPEC PureVirtualReplacement_Derived: public PureVirtualReplacement {
147        public:
148            int methodNew(int param);
149        };";
150    $SOURCE2 .= "
151        int PureVirtualReplacement::otherMethod() { return 0; }
152        int PureVirtualReplacement_Derived::methodNew(int param) { return 0; }";
153
154    # Virtual_Replacement
155    $HEADER1 .= "
156        class $DECL_SPEC VirtualReplacement {
157        public:
158            virtual int methodOld(int param);
159        };";
160    $SOURCE1 .= "
161        int VirtualReplacement::methodOld(int param) { return 0; }";
162
163    $HEADER2 .= "
164        class $DECL_SPEC VirtualReplacement {
165        public:
166            virtual int methodNew(int param);
167        };";
168    $SOURCE2 .= "
169        int VirtualReplacement::methodNew(int param) { return 0; }";
170
171    # Removed_Symbol (renamed, source-compatible)
172    $HEADER1 .= "
173        int $DECL_SPEC renamedFunc(int param);";
174    $SOURCE1 .= "
175        int renamedFunc(int param) { return 0; }";
176
177    $HEADER2 .= "
178        int $DECL_SPEC renamedFunc_NewName(int param);
179        #define renamedFunc renamedFunc_NewName";
180    $SOURCE2 .= "
181        int renamedFunc_NewName(int param) { return 0; }";
182
183    # Removed_Symbol
184    $HEADER1 .= "
185        int $DECL_SPEC functionBecameInline(int param);";
186    $SOURCE1 .= "
187        int functionBecameInline(int param) { return 0; }";
188
189    $HEADER2 .= "
190        inline int functionBecameInline(int param) { return 0; }";
191
192    # Removed_Symbol (safe)
193    $HEADER1 .= "
194        inline int removedInlineFunction(int param) { return 0; }";
195
196    # Became Non-Opaque
197    $HEADER1 .= "
198        struct OpaqueStruct;
199        int paramBecameNonOpaque(OpaqueStruct* p);";
200    $SOURCE1 .= "
201        int paramBecameNonOpaque(OpaqueStruct* p) { return 0; }";
202
203    $HEADER2 .= "
204        struct OpaqueStruct
205        {
206            int i;
207            short j;
208            OpaqueStruct();
209        };
210        int paramBecameNonOpaque(OpaqueStruct* p);";
211    $SOURCE2 .= "
212        int paramBecameNonOpaque(OpaqueStruct* p) { return 0; }";
213
214    # Field_Became_Const
215    # Typedef
216    $HEADER1 .= "
217        typedef int*const CONST_INT_PTR;
218        class $DECL_SPEC FieldBecameConstTypedef {
219        public:
220            int* f;
221            int*const f2;
222            int method(CONST_INT_PTR p);
223        };";
224    $SOURCE1 .= "
225        int FieldBecameConstTypedef::method(CONST_INT_PTR p) { return 0; }";
226
227    $HEADER2 .= "
228        typedef int*const CONST_INT_PTR;
229        class $DECL_SPEC FieldBecameConstTypedef {
230        public:
231            CONST_INT_PTR f;
232            int*const f2;
233            int method(CONST_INT_PTR p);
234        };";
235    $SOURCE2 .= "
236        int FieldBecameConstTypedef::method(CONST_INT_PTR p) { return 0; }";
237
238    # Field_Removed_Const
239    $HEADER1 .= "
240        class $DECL_SPEC FieldRemovedConst {
241        public:
242            int*const*const f;
243            int method();
244        };";
245    $SOURCE1 .= "
246        int FieldRemovedConst::method() { return 0; }";
247
248    $HEADER2 .= "
249        class $DECL_SPEC FieldRemovedConst {
250        public:
251            int**const f;
252            int method();
253        };";
254    $SOURCE2 .= "
255        int FieldRemovedConst::method() { return 0; }";
256
257    # Field_Became_Const
258    $HEADER1 .= "
259        class $DECL_SPEC FieldBecameConst {
260        public:
261            int* f;
262            int method();
263        };";
264    $SOURCE1 .= "
265        int FieldBecameConst::method() { return 0; }";
266
267    $HEADER2 .= "
268        class $DECL_SPEC FieldBecameConst {
269        public:
270            int*const f;
271            int method();
272        };";
273    $SOURCE2 .= "
274        int FieldBecameConst::method() { return 0; }";
275
276    # Field_Became_Private
277    $HEADER1 .= "
278        class $DECL_SPEC FieldBecamePrivate {
279        public:
280            int* f;
281            int method();
282        };";
283    $SOURCE1 .= "
284        int FieldBecamePrivate::method() { return 0; }";
285
286    $HEADER2 .= "
287        class $DECL_SPEC FieldBecamePrivate {
288        private:
289            int* f;
290        public:
291            int method();
292        };";
293    $SOURCE2 .= "
294        int FieldBecamePrivate::method() { return 0; }";
295
296    # Field_Became_Protected
297    $HEADER1 .= "
298        class $DECL_SPEC FieldBecameProtected {
299        public:
300            int* f;
301            int method();
302        };";
303    $SOURCE1 .= "
304        int FieldBecameProtected::method() { return 0; }";
305
306    $HEADER2 .= "
307        class $DECL_SPEC FieldBecameProtected {
308        protected:
309            int* f;
310        public:
311            int method();
312        };";
313    $SOURCE2 .= "
314        int FieldBecameProtected::method() { return 0; }";
315
316    # Global_Data_Became_Private
317    $HEADER1 .= "
318        class $DECL_SPEC GlobalDataBecamePrivate {
319        public:
320            static int data;
321
322        };";
323    $SOURCE1 .= "
324        int GlobalDataBecamePrivate::data = 10;";
325
326    $HEADER2 .= "
327        class $DECL_SPEC GlobalDataBecamePrivate {
328        private:
329            static int data;
330
331        };";
332    $SOURCE2 .= "
333        int GlobalDataBecamePrivate::data = 10;";
334
335    # Method_Became_Private
336    $HEADER1 .= "
337        class $DECL_SPEC MethodBecamePrivate {
338        public:
339            int method();
340        };";
341    $SOURCE1 .= "
342        int MethodBecamePrivate::method() { return 0; }";
343
344    $HEADER2 .= "
345        class $DECL_SPEC MethodBecamePrivate {
346        private:
347            int method();
348        };";
349    $SOURCE2 .= "
350        int MethodBecamePrivate::method() { return 0; }";
351
352    # Method_Became_Protected
353    $HEADER1 .= "
354        class $DECL_SPEC MethodBecameProtected {
355        public:
356            int method();
357        };";
358    $SOURCE1 .= "
359        int MethodBecameProtected::method() { return 0; }";
360
361    $HEADER2 .= "
362        class $DECL_SPEC MethodBecameProtected {
363        protected:
364            int method();
365        };";
366    $SOURCE2 .= "
367        int MethodBecameProtected::method() { return 0; }";
368
369    # Method_Became_Public
370    $HEADER1 .= "
371        class $DECL_SPEC MethodBecamePublic {
372        protected:
373            int method();
374        };";
375    $SOURCE1 .= "
376        int MethodBecamePublic::method() { return 0; }";
377
378    $HEADER2 .= "
379        class $DECL_SPEC MethodBecamePublic {
380        public:
381            int method();
382        };";
383    $SOURCE2 .= "
384        int MethodBecamePublic::method() { return 0; }";
385
386    # Removed_Const_Overload
387    $HEADER1 .= "
388        class $DECL_SPEC RemovedConstOverload {
389        public:
390            int removed();
391            int removed() const;
392        };";
393    $SOURCE1 .= "
394        int RemovedConstOverload::removed() { return 0; }
395        int RemovedConstOverload::removed() const { return 0; }";
396
397    $HEADER2 .= "
398        class $DECL_SPEC RemovedConstOverload {
399        public:
400            int removed();
401        };";
402    $SOURCE2 .= "
403        int RemovedConstOverload::removed() { return 0; }";
404
405    # Inline method
406    $HEADER1 .= "
407        class $DECL_SPEC InlineMethod {
408        public:
409            inline int foo() { return 0; }
410        };";
411
412    $HEADER2 .= "
413        class $DECL_SPEC InlineMethod {
414        public:
415            inline long foo() { return 0; }
416        };";
417
418    # Global_Data_Became_Non_Const
419    $HEADER1 .= "
420        $EXTERN $DECL_SPEC const int globalDataBecameNonConst = 10;";
421
422    $HEADER2 .= "
423        extern $DECL_SPEC int globalDataBecameNonConst;";
424    $SOURCE2 .= "
425        int globalDataBecameNonConst = 15;";
426
427    # Global_Data_Became_Non_Const
428    # Class Member
429    $HEADER1 .= "
430        class $DECL_SPEC GlobalDataBecameNonConst {
431        public:
432            static const int data;
433        };";
434    $SOURCE1 .= "
435        const int GlobalDataBecameNonConst::data = 10;";
436
437    $HEADER2 .= "
438        class $DECL_SPEC GlobalDataBecameNonConst {
439        public:
440            static int data;
441        };";
442    $SOURCE2 .= "
443        int GlobalDataBecameNonConst::data = 10;";
444
445    # Global_Data_Became_Const
446    $HEADER1 .= "
447        extern $DECL_SPEC int globalDataBecameConst;";
448    $SOURCE1 .= "
449        int globalDataBecameConst = 10;";
450
451    $HEADER2 .= "
452        $EXTERN $DECL_SPEC const int globalDataBecameConst = 15;";
453
454    # Global_Data_Became_Const
455    # Class Member
456    $HEADER1 .= "
457        class $DECL_SPEC GlobalDataBecameConst {
458        public:
459            static int Data;
460        };";
461    $SOURCE1 .= "
462        int GlobalDataBecameConst::Data = 10;";
463
464    $HEADER2 .= "
465        class $DECL_SPEC GlobalDataBecameConst {
466        public:
467            static const int Data = 15;
468        };";
469
470    # Global_Data_Value_Changed
471    $HEADER1 .= "
472        class $DECL_SPEC GlobalDataValue {
473        public:
474            static const int Integer = 10;
475            static const char Char = \'o\';
476        };";
477
478    $HEADER2 .= "
479        class $DECL_SPEC GlobalDataValue {
480        public:
481            static const int Integer = 15;
482            static const char Char = \'N\';
483        };";
484
485    # Global_Data_Value_Changed
486    # Integer
487    $HEADER1 .= "
488        $EXTERN $DECL_SPEC const int globalDataValue_Integer = 10;";
489
490    $HEADER2 .= "
491        $EXTERN $DECL_SPEC const int globalDataValue_Integer = 15;";
492
493    # Global_Data_Value_Changed
494    # Character
495    $HEADER1 .= "
496        $EXTERN $DECL_SPEC const char globalDataValue_Char = \'o\';";
497
498    $HEADER2 .= "
499        $EXTERN $DECL_SPEC const char globalDataValue_Char = \'N\';";
500
501    # Parameter_Became_Restrict
502    $HEADER1 .= "
503        class $DECL_SPEC ParameterBecameRestrict {
504        public:
505            int method(int* param);
506        };";
507    $SOURCE1 .= "
508        int ParameterBecameRestrict::method(int* param) { return 0; }";
509
510    $HEADER2 .= "
511        class $DECL_SPEC ParameterBecameRestrict {
512        public:
513            int method(int* __restrict param);
514        };";
515    $SOURCE2 .= "
516        int ParameterBecameRestrict::method(int* __restrict param) { return 0; }";
517
518    # Parameter_Became_Non_Restrict
519    $HEADER1 .= "
520        class $DECL_SPEC ParameterBecameNonRestrict {
521        public:
522            int method(int* __restrict param);
523        };";
524    $SOURCE1 .= "
525        int ParameterBecameNonRestrict::method(int* __restrict param) { return 0; }";
526
527    $HEADER2 .= "
528        class $DECL_SPEC ParameterBecameNonRestrict {
529        public:
530            int method(int* param);
531        };";
532    $SOURCE2 .= "
533        int ParameterBecameNonRestrict::method(int* param) { return 0; }";
534
535    # Field_Became_Volatile
536    $HEADER1 .= "
537        class $DECL_SPEC FieldBecameVolatile {
538        public:
539            int method(int param);
540            int f;
541        };";
542    $SOURCE1 .= "
543        int FieldBecameVolatile::method(int param) { return param; }";
544
545    $HEADER2 .= "
546        class $DECL_SPEC FieldBecameVolatile {
547        public:
548            int method(int param);
549            volatile int f;
550        };";
551    $SOURCE2 .= "
552        int FieldBecameVolatile::method(int param) { return param; }";
553
554    # Field_Became_Non_Volatile
555    $HEADER1 .= "
556        class $DECL_SPEC FieldBecameNonVolatile {
557        public:
558            int method(int param);
559            volatile int f;
560        };";
561    $SOURCE1 .= "
562        int FieldBecameNonVolatile::method(int param) { return param; }";
563
564    $HEADER2 .= "
565        class $DECL_SPEC FieldBecameNonVolatile {
566        public:
567            int method(int param);
568            int f;
569        };";
570    $SOURCE2 .= "
571        int FieldBecameNonVolatile::method(int param) { return param; }";
572
573    # Field_Became_Mutable
574    $HEADER1 .= "
575        class $DECL_SPEC FieldBecameMutable {
576        public:
577            int method(int param);
578            int f;
579        };";
580    $SOURCE1 .= "
581        int FieldBecameMutable::method(int param) { return param; }";
582
583    $HEADER2 .= "
584        class $DECL_SPEC FieldBecameMutable {
585        public:
586            int method(int param);
587            mutable int f;
588        };";
589    $SOURCE2 .= "
590        int FieldBecameMutable::method(int param) { return param; }";
591
592    # Field_Became_Non_Mutable
593    $HEADER1 .= "
594        class $DECL_SPEC FieldBecameNonMutable {
595        public:
596            int method(int param);
597            mutable int f;
598        };";
599    $SOURCE1 .= "
600        int FieldBecameNonMutable::method(int param) { return param; }";
601
602    $HEADER2 .= "
603        class $DECL_SPEC FieldBecameNonMutable {
604        public:
605            int method(int param);
606            int f;
607        };";
608    $SOURCE2 .= "
609        int FieldBecameNonMutable::method(int param) { return param; }";
610
611    # Method_Became_Const
612    # Method_Became_Volatile
613    $HEADER1 .= "
614        class $DECL_SPEC MethodBecameConstVolatile {
615        public:
616            int method(int param);
617        };";
618    $SOURCE1 .= "
619        int MethodBecameConstVolatile::method(int param) { return param; }";
620
621    $HEADER2 .= "
622        class $DECL_SPEC MethodBecameConstVolatile {
623        public:
624            int method(int param) volatile const;
625        };";
626    $SOURCE2 .= "
627        int MethodBecameConstVolatile::method(int param) volatile const { return param; }";
628
629    # Method_Became_Const
630    $HEADER1 .= "
631        class $DECL_SPEC MethodBecameConst {
632        public:
633            int method(int param);
634        };";
635    $SOURCE1 .= "
636        int MethodBecameConst::method(int param) { return param; }";
637
638    $HEADER2 .= "
639        class $DECL_SPEC MethodBecameConst {
640        public:
641            int method(int param) const;
642        };";
643    $SOURCE2 .= "
644        int MethodBecameConst::method(int param) const { return param; }";
645
646    # Method_Became_Non_Const
647    $HEADER1 .= "
648        class $DECL_SPEC MethodBecameNonConst {
649        public:
650            int method(int param) const;
651        };";
652    $SOURCE1 .= "
653        int MethodBecameNonConst::method(int param) const { return param; }";
654
655    $HEADER2 .= "
656        class $DECL_SPEC MethodBecameNonConst {
657        public:
658            int method(int param);
659        };";
660    $SOURCE2 .= "
661        int MethodBecameNonConst::method(int param) { return param; }";
662
663    # Method_Became_Volatile
664    $HEADER1 .= "
665        class $DECL_SPEC MethodBecameVolatile {
666        public:
667            int method(int param);
668        };";
669    $SOURCE1 .= "
670        int MethodBecameVolatile::method(int param) { return param; }";
671
672    $HEADER2 .= "
673        class $DECL_SPEC MethodBecameVolatile {
674        public:
675            int method(int param) volatile;
676        };";
677    $SOURCE2 .= "
678        int MethodBecameVolatile::method(int param) volatile { return param; }";
679
680    # Virtual_Method_Position
681    # Multiple bases
682    $HEADER1 .= "
683        class $DECL_SPEC PrimaryBase
684        {
685        public:
686            virtual ~PrimaryBase();
687            virtual void foo();
688        };
689        class $DECL_SPEC SecondaryBase
690        {
691        public:
692            virtual ~SecondaryBase();
693            virtual void bar();
694        };
695        class UnsafeVirtualOverride: public PrimaryBase, public SecondaryBase
696        {
697        public:
698            UnsafeVirtualOverride();
699            ~UnsafeVirtualOverride();
700            void foo();
701        };";
702    $SOURCE1 .= "
703        PrimaryBase::~PrimaryBase() { }
704        void PrimaryBase::foo() { }
705
706        SecondaryBase::~SecondaryBase() { }
707        void SecondaryBase::bar() { }
708
709        UnsafeVirtualOverride::UnsafeVirtualOverride() { }
710        UnsafeVirtualOverride::~UnsafeVirtualOverride() { }
711        void UnsafeVirtualOverride::foo() { }";
712
713    $HEADER2 .= "
714        class $DECL_SPEC PrimaryBase
715        {
716        public:
717            virtual ~PrimaryBase();
718            virtual void foo();
719        };
720        class $DECL_SPEC SecondaryBase
721        {
722        public:
723            virtual ~SecondaryBase();
724            virtual void bar();
725        };
726        class UnsafeVirtualOverride: public PrimaryBase, public SecondaryBase
727        {
728        public:
729            UnsafeVirtualOverride();
730            ~UnsafeVirtualOverride();
731            void foo();
732            void bar();
733        };";
734    $SOURCE2 .= "
735        PrimaryBase::~PrimaryBase() { }
736        void PrimaryBase::foo() { }
737
738        SecondaryBase::~SecondaryBase() { }
739        void SecondaryBase::bar() { }
740
741        UnsafeVirtualOverride::UnsafeVirtualOverride() { }
742        UnsafeVirtualOverride::~UnsafeVirtualOverride() { }
743        void UnsafeVirtualOverride::foo() { }
744        void UnsafeVirtualOverride::bar() { }";
745
746    # Removed_Interface (inline virtual d-tor)
747    $HEADER1 .= "
748        template <typename T>
749        class $DECL_SPEC BaseTemplate {
750        public:
751            BaseTemplate() { }
752            virtual int method(int param) { return param; };
753            virtual ~BaseTemplate() { };
754        };
755        class $DECL_SPEC RemovedVirtualDestructor: public BaseTemplate<int> {
756        public:
757            RemovedVirtualDestructor() { };
758            virtual int method2(int param);
759        };";
760    $SOURCE1 .= "
761        int RemovedVirtualDestructor::method2(int param) { return param; }";
762
763    $HEADER2 .= "
764        template <typename T>
765        class $DECL_SPEC BaseTemplate {
766        public:
767            BaseTemplate() { }
768            virtual int method(int param) { return param; };
769            //virtual ~BaseTemplate() { };
770        };
771        class $DECL_SPEC RemovedVirtualDestructor: public BaseTemplate<int> {
772        public:
773            RemovedVirtualDestructor() { };
774            virtual int method2(int param);
775        };";
776    $SOURCE2 .= "
777        int RemovedVirtualDestructor::method2(int param) { return param; }";
778
779    # Added_Virtual_Method_At_End
780    $HEADER1 .= "
781        class $DECL_SPEC DefaultConstructor {
782        public:
783            DefaultConstructor() { }
784            virtual int method(int param);
785        };";
786    $SOURCE1 .= "
787        int DefaultConstructor::method(int param) { return param; }";
788
789    $HEADER2 .= "
790        class $DECL_SPEC DefaultConstructor {
791        public:
792            DefaultConstructor() { }
793            virtual int method(int param);
794            virtual int addedMethod(int param);
795        };";
796    $SOURCE2 .= "
797        int DefaultConstructor::method(int param) { return addedMethod(param); }
798        int DefaultConstructor::addedMethod(int param) { return param; }";
799
800    # Added_Enum_Member
801    $HEADER1 .= "
802        enum AddedEnumMember {
803            OldMember
804        };
805        $DECL_SPEC int addedEnumMember(enum AddedEnumMember param);";
806    $SOURCE1 .= "
807        int addedEnumMember(enum AddedEnumMember param) { return 0; }";
808
809    $HEADER2 .= "
810        enum AddedEnumMember {
811            OldMember,
812            NewMember
813        };
814        $DECL_SPEC int addedEnumMember(enum AddedEnumMember param);";
815    $SOURCE2 .= "
816        int addedEnumMember(enum AddedEnumMember param) { return 0; }";
817
818    # Parameter_Type_Format (Safe)
819    $HEADER1 .= "
820        struct DType
821        {
822            int i;
823            double j;
824        };
825        $DECL_SPEC int parameterTypeFormat_Safe(struct DType param);";
826    $SOURCE1 .= "
827        int parameterTypeFormat_Safe(struct DType param) { return 0; }";
828
829    $HEADER2 .= "
830        class DType
831        {
832            int i;
833            double j;
834        };
835        $DECL_SPEC int parameterTypeFormat_Safe(class DType param);";
836    $SOURCE2 .= "
837        int parameterTypeFormat_Safe(class DType param) { return 0; }";
838
839    # Type_Became_Opaque (Struct)
840    $HEADER1 .= "
841        struct StructBecameOpaque
842        {
843            int i, j;
844        };
845        $DECL_SPEC int structBecameOpaque(struct StructBecameOpaque* param);";
846    $SOURCE1 .= "
847        int structBecameOpaque(struct StructBecameOpaque* param) { return 0; }";
848
849    $HEADER2 .= "
850        struct StructBecameOpaque;
851        $DECL_SPEC int structBecameOpaque(struct StructBecameOpaque* param);";
852    $SOURCE2 .= "
853        int structBecameOpaque(struct StructBecameOpaque* param) { return 0; }";
854
855    # Type_Became_Opaque (Union)
856    $HEADER1 .= "
857        union UnionBecameOpaque
858        {
859            int i, j;
860        };
861        $DECL_SPEC int unionBecameOpaque(union UnionBecameOpaque* param);";
862    $SOURCE1 .= "
863        int unionBecameOpaque(union UnionBecameOpaque* param) { return 0; }";
864
865    $HEADER2 .= "
866        union UnionBecameOpaque;
867        $DECL_SPEC int unionBecameOpaque(union UnionBecameOpaque* param);";
868    $SOURCE2 .= "
869        int unionBecameOpaque(union UnionBecameOpaque* param) { return 0; }";
870
871    # Field_Type_Format
872    $HEADER1 .= "
873        struct DType1
874        {
875            int i;
876            double j[7];
877        };
878        struct FieldTypeFormat
879        {
880            int i;
881            struct DType1 j;
882        };
883        $DECL_SPEC int fieldTypeFormat(struct FieldTypeFormat param);";
884    $SOURCE1 .= "
885        int fieldTypeFormat(struct FieldTypeFormat param) { return 0; }";
886
887    $HEADER2 .= "
888        struct DType2
889        {
890            double i[7];
891            int j;
892        };
893        struct FieldTypeFormat
894        {
895            int i;
896            struct DType2 j;
897        };
898        $DECL_SPEC int fieldTypeFormat(struct FieldTypeFormat param);";
899    $SOURCE2 .= "
900        int fieldTypeFormat(struct FieldTypeFormat param) { return 0; }";
901
902    # Field_Type_Format (func ptr)
903    $HEADER1 .= "
904        typedef void (*FuncPtr_Old) (int a);
905        struct FieldTypeFormat_FuncPtr
906        {
907            int i;
908            FuncPtr_Old j;
909        };
910        $DECL_SPEC int fieldTypeFormat_FuncPtr(struct FieldTypeFormat_FuncPtr param);";
911    $SOURCE1 .= "
912        int fieldTypeFormat_FuncPtr(struct FieldTypeFormat_FuncPtr param) { return 0; }";
913
914    $HEADER2 .= "
915        typedef void (*FuncPtr_New) (int a, int b);
916        struct FieldTypeFormat_FuncPtr
917        {
918            int i;
919            FuncPtr_New j;
920        };
921        $DECL_SPEC int fieldTypeFormat_FuncPtr(struct FieldTypeFormat_FuncPtr param);";
922    $SOURCE2 .= "
923        int fieldTypeFormat_FuncPtr(struct FieldTypeFormat_FuncPtr param) { return 0; }";
924
925    # Removed_Virtual_Method (inline)
926    $HEADER1 .= "
927        class $DECL_SPEC RemovedInlineVirtualFunction {
928        public:
929            RemovedInlineVirtualFunction();
930            virtual int removedMethod(int param) { return 0; }
931            virtual int method(int param);
932        };";
933    $SOURCE1 .= "
934        int RemovedInlineVirtualFunction::method(int param) { return param; }
935        RemovedInlineVirtualFunction::RemovedInlineVirtualFunction() { }";
936
937    $HEADER2 .= "
938        class $DECL_SPEC RemovedInlineVirtualFunction {
939        public:
940            RemovedInlineVirtualFunction();
941            virtual int method(int param);
942        };";
943    $SOURCE2 .= "
944        int RemovedInlineVirtualFunction::method(int param) { return param; }
945        RemovedInlineVirtualFunction::RemovedInlineVirtualFunction() { }";
946
947    # MethodPtr
948    $HEADER1 .= "
949        class TestMethodPtr {
950            public:
951                typedef void (TestMethodPtr::*Method)(int*);
952                Method _method;
953                TestMethodPtr();
954                void method();
955        };";
956    $SOURCE1 .= "
957        TestMethodPtr::TestMethodPtr() { }
958        void TestMethodPtr::method() { }";
959
960    $HEADER2 .= "
961        class TestMethodPtr {
962            public:
963                typedef void (TestMethodPtr::*Method)(int*, void*);
964                Method _method;
965                TestMethodPtr();
966                void method();
967        };";
968    $SOURCE2 .= "
969        TestMethodPtr::TestMethodPtr() { }
970        void TestMethodPtr::method() { }";
971
972    # FieldPtr
973    $HEADER1 .= "
974        class TestFieldPtr {
975            public:
976                typedef void* (TestFieldPtr::*Field);
977                Field _field;
978                TestFieldPtr();
979                void method(void*);
980        };";
981    $SOURCE1 .= "
982        TestFieldPtr::TestFieldPtr(){ }
983        void TestFieldPtr::method(void*) { }";
984
985    $HEADER2 .= "
986        class TestFieldPtr {
987            public:
988                typedef int (TestFieldPtr::*Field);
989                Field _field;
990                TestFieldPtr();
991                void method(void*);
992        };";
993    $SOURCE2 .= "
994        TestFieldPtr::TestFieldPtr(){ }
995        void TestFieldPtr::method(void*) { }";
996
997    # Removed_Symbol (Template Specializations)
998    $HEADER1 .= "
999        template <unsigned int _TP, typename AAA>
1000        class Template {
1001            public:
1002                char const *field;
1003        };
1004        template <unsigned int _TP, typename AAA>
1005        class TestRemovedTemplate {
1006            public:
1007                char const *field;
1008                void method(int);
1009        };
1010        template <>
1011        class TestRemovedTemplate<7, char> {
1012            public:
1013                char const *field;
1014                void method(int);
1015        };";
1016    $SOURCE1 .= "
1017        void TestRemovedTemplate<7, char>::method(int){ }";
1018
1019    # Removed_Symbol (Template Specializations)
1020    $HEADER1 .= "
1021        template <typename TName>
1022        int removedTemplateSpec(TName);
1023
1024        template <> int removedTemplateSpec<char>(char);";
1025    $SOURCE1 .= "
1026        template <> int removedTemplateSpec<char>(char){return 0;}";
1027
1028    # Removed_Field (Ref)
1029    $HEADER1 .= "
1030        struct TestRefChange {
1031            int a, b, c;
1032        };
1033        $DECL_SPEC int paramRefChange(const TestRefChange & p1, int p2);";
1034    $SOURCE1 .= "
1035        int paramRefChange(const TestRefChange & p1, int p2) { return p2; }";
1036
1037    $HEADER2 .= "
1038        struct TestRefChange {
1039            int a, b;
1040        };
1041        $DECL_SPEC int paramRefChange(const TestRefChange & p1, int p2);";
1042    $SOURCE2 .= "
1043        int paramRefChange(const TestRefChange & p1, int p2) { return p2; }";
1044
1045    # Removed_Parameter
1046    $HEADER1 .= "
1047        $DECL_SPEC int removedParameter(int param, int removed_param);";
1048    $SOURCE1 .= "
1049        int removedParameter(int param, int removed_param) { return 0; }";
1050
1051    $HEADER2 .= "
1052        $DECL_SPEC int removedParameter(int param);";
1053    $SOURCE2 .= "
1054        int removedParameter(int param) { return 0; }";
1055
1056    # Added_Parameter
1057    $HEADER1 .= "
1058        $DECL_SPEC int addedParameter(int param);";
1059    $SOURCE1 .= "
1060        int addedParameter(int param) { return 0; }";
1061
1062    $HEADER2 .= "
1063        $DECL_SPEC int addedParameter(int param, int added_param);";
1064    $SOURCE2 .= "
1065        int addedParameter(int param, int added_param) { return 0; }";
1066
1067    # Added
1068    $HEADER2 .= "
1069        typedef int (*FUNCPTR_TYPE)(int a, int b);
1070        $DECL_SPEC int addedFunc(FUNCPTR_TYPE*const** f);";
1071    $SOURCE2 .= "
1072        int addedFunc(FUNCPTR_TYPE*const** f) { return 0; }";
1073
1074    # Added (3)
1075    $HEADER2 .= "
1076        struct DStruct
1077        {
1078            int i, j, k;
1079        };
1080        int addedFunc3(struct DStruct* p);";
1081    $SOURCE2 .= "
1082        int addedFunc3(struct DStruct* p) { return 0; }";
1083
1084    # Added_Virtual_Method
1085    $HEADER1 .= "
1086        class $DECL_SPEC AddedVirtualMethod {
1087        public:
1088            virtual int method(int param);
1089        };";
1090    $SOURCE1 .= "
1091        int AddedVirtualMethod::method(int param) { return param; }";
1092
1093    $HEADER2 .= "
1094        class $DECL_SPEC AddedVirtualMethod {
1095        public:
1096            virtual int addedMethod(int param);
1097            virtual int method(int param);
1098        };";
1099    $SOURCE2 .= "
1100        int AddedVirtualMethod::addedMethod(int param) {
1101            return param;
1102        }
1103        int AddedVirtualMethod::method(int param) { return param; }";
1104
1105    # Added_Virtual_Method (added "virtual" attribute)
1106    $HEADER1 .= "
1107        class $DECL_SPEC BecameVirtualMethod {
1108        public:
1109            int becameVirtual(int param);
1110            virtual int method(int param);
1111        };";
1112    $SOURCE1 .= "
1113        int BecameVirtualMethod::becameVirtual(int param) { return param; }
1114        int BecameVirtualMethod::method(int param) { return param; }";
1115
1116    $HEADER2 .= "
1117        class $DECL_SPEC BecameVirtualMethod {
1118        public:
1119            virtual int becameVirtual(int param);
1120            virtual int method(int param);
1121        };";
1122    $SOURCE2 .= "
1123        int BecameVirtualMethod::becameVirtual(int param) { return param; }
1124        int BecameVirtualMethod::method(int param) { return param; }";
1125
1126    # Added_Pure_Virtual_Method
1127    $HEADER1 .= "
1128        class $DECL_SPEC AddedPureVirtualMethod {
1129        public:
1130            virtual int method(int param);
1131            int otherMethod(int param);
1132        };";
1133    $SOURCE1 .= "
1134        int AddedPureVirtualMethod::method(int param) { return param; }
1135        int AddedPureVirtualMethod::otherMethod(int param) { return param; }";
1136
1137    $HEADER2 .= "
1138        class $DECL_SPEC AddedPureVirtualMethod {
1139        public:
1140            virtual int addedMethod(int param)=0;
1141            virtual int method(int param);
1142            int otherMethod(int param);
1143        };";
1144    $SOURCE2 .= "
1145        int AddedPureVirtualMethod::method(int param) { return param; }
1146        int AddedPureVirtualMethod::otherMethod(int param) { return param; }";
1147
1148    # Added_Virtual_Method_At_End (Safe)
1149    $HEADER1 .= "
1150        class $DECL_SPEC AddedVirtualMethodAtEnd {
1151        public:
1152            AddedVirtualMethodAtEnd();
1153            int method1(int param);
1154            virtual int method2(int param);
1155        };";
1156    $SOURCE1 .= "
1157        AddedVirtualMethodAtEnd::AddedVirtualMethodAtEnd() { }
1158        int AddedVirtualMethodAtEnd::method1(int param) { return param; }
1159        int AddedVirtualMethodAtEnd::method2(int param) { return param; }";
1160
1161    $HEADER2 .= "
1162        class $DECL_SPEC AddedVirtualMethodAtEnd {
1163        public:
1164            AddedVirtualMethodAtEnd();
1165            int method1(int param);
1166            virtual int method2(int param);
1167            virtual int addedMethod(int param);
1168        };";
1169    $SOURCE2 .= "
1170        AddedVirtualMethodAtEnd::AddedVirtualMethodAtEnd() { }
1171        int AddedVirtualMethodAtEnd::method1(int param) { return param; }
1172        int AddedVirtualMethodAtEnd::method2(int param) { return param; }
1173        int AddedVirtualMethodAtEnd::addedMethod(int param) { return param; }";
1174
1175    # Added_Virtual_Method_At_End (With Default Constructor)
1176    $HEADER1 .= "
1177        class $DECL_SPEC AddedVirtualMethodAtEnd_DefaultConstructor {
1178        public:
1179            int method1(int param);
1180            virtual int method2(int param);
1181        };";
1182    $SOURCE1 .= "
1183        int AddedVirtualMethodAtEnd_DefaultConstructor::method1(int param) { return param; }
1184        int AddedVirtualMethodAtEnd_DefaultConstructor::method2(int param) { return param; }";
1185
1186    $HEADER2 .= "
1187        class $DECL_SPEC AddedVirtualMethodAtEnd_DefaultConstructor {
1188        public:
1189            int method1(int param);
1190            virtual int method2(int param);
1191            virtual int addedMethod(int param);
1192        };";
1193    $SOURCE2 .= "
1194        int AddedVirtualMethodAtEnd_DefaultConstructor::method1(int param) { return param; }
1195        int AddedVirtualMethodAtEnd_DefaultConstructor::method2(int param) { return param; }
1196        int AddedVirtualMethodAtEnd_DefaultConstructor::addedMethod(int param) { return param; }";
1197
1198    # Added_First_Virtual_Method
1199    $HEADER1 .= "
1200        class $DECL_SPEC AddedFirstVirtualMethod {
1201        public:
1202            int method(int param);
1203        };";
1204    $SOURCE1 .= "
1205        int AddedFirstVirtualMethod::method(int param) { return param; }";
1206
1207    $HEADER2 .= "
1208        class $DECL_SPEC AddedFirstVirtualMethod {
1209        public:
1210            int method(int param);
1211            virtual int addedMethod(int param);
1212        };";
1213    $SOURCE2 .= "
1214        int AddedFirstVirtualMethod::method(int param) { return param; }
1215        int AddedFirstVirtualMethod::addedMethod(int param) { return param; }";
1216
1217    # Removed_Virtual_Method
1218    $HEADER1 .= "
1219        class $DECL_SPEC RemovedVirtualFunction {
1220        public:
1221            int a, b, c;
1222            virtual int removedMethod(int param);
1223            virtual int vMethod(int param);
1224    };";
1225    $SOURCE1 .= "
1226        int RemovedVirtualFunction::removedMethod(int param) { return param; }
1227        int RemovedVirtualFunction::vMethod(int param) { return param; }";
1228
1229    $HEADER2 .= "
1230        class $DECL_SPEC RemovedVirtualFunction {
1231        public:
1232            int a, b, c;
1233            int removedMethod(int param);
1234            virtual int vMethod(int param);
1235    };";
1236    $SOURCE2 .= "
1237        int RemovedVirtualFunction::removedMethod(int param) { return param; }
1238        int RemovedVirtualFunction::vMethod(int param) { return param; }";
1239
1240    # Removed_Virtual_Method (Pure, From the End)
1241    $HEADER1 .= "
1242        class $DECL_SPEC RemovedPureVirtualMethodFromEnd {
1243        public:
1244            virtual int method(int param);
1245            virtual int removedMethod(int param)=0;
1246        };";
1247    $SOURCE1 .= "
1248        int RemovedPureVirtualMethodFromEnd::method(int param) { return param; }
1249        int RemovedPureVirtualMethodFromEnd::removedMethod(int param) { return param; }";
1250
1251    $HEADER2 .= "
1252        class $DECL_SPEC RemovedPureVirtualMethodFromEnd
1253        {
1254        public:
1255            virtual int method(int param);
1256            int removedMethod(int param);
1257        };";
1258    $SOURCE2 .= "
1259        int RemovedPureVirtualMethodFromEnd::method(int param) { return param; }
1260        int RemovedPureVirtualMethodFromEnd::removedMethod(int param) { return param; }";
1261
1262    # Removed_Symbol (Pure with Implementation)
1263    $HEADER1 .= "
1264        class $DECL_SPEC RemovedPureSymbol {
1265        public:
1266            virtual int method(int param);
1267            virtual int removedMethod(int param)=0;
1268        };";
1269    $SOURCE1 .= "
1270        int RemovedPureSymbol::method(int param) { return param; }
1271        int RemovedPureSymbol::removedMethod(int param) { return param; }";
1272
1273    $HEADER2 .= "
1274        class $DECL_SPEC RemovedPureSymbol
1275        {
1276        public:
1277            virtual int method(int param);
1278        };";
1279    $SOURCE2 .= "
1280        int RemovedPureSymbol::method(int param) { return param; }";
1281
1282    # Removed_Virtual_Method (From the End)
1283    $HEADER1 .= "
1284        class $DECL_SPEC RemovedVirtualMethodFromEnd {
1285        public:
1286            virtual int method(int param);
1287            virtual int removedMethod(int param);
1288        };";
1289    $SOURCE1 .= "
1290        int RemovedVirtualMethodFromEnd::method(int param) { return param; }
1291        int RemovedVirtualMethodFromEnd::removedMethod(int param) { return param; }";
1292
1293    $HEADER2 .= "
1294        class $DECL_SPEC RemovedVirtualMethodFromEnd
1295        {
1296        public:
1297            virtual int method(int param);
1298            int removedMethod(int param);
1299        };";
1300    $SOURCE2 .= "
1301        int RemovedVirtualMethodFromEnd::method(int param) { return param; }
1302        int RemovedVirtualMethodFromEnd::removedMethod(int param) { return param; }";
1303
1304    # Removed_Last_Virtual_Method
1305    $HEADER1 .= "
1306        class $DECL_SPEC RemovedLastVirtualMethod
1307        {
1308        public:
1309            int method(int param);
1310            virtual int removedMethod(int param);
1311        };";
1312    $SOURCE1 .= "
1313        int RemovedLastVirtualMethod::method(int param) { return param; }";
1314    $SOURCE1 .= "
1315        int RemovedLastVirtualMethod::removedMethod(int param) { return param; }";
1316
1317    $HEADER2 .= "
1318        class $DECL_SPEC RemovedLastVirtualMethod
1319        {
1320        public:
1321            int method(int param);
1322            int removedMethod(int param);
1323        };";
1324    $SOURCE2 .= "
1325        int RemovedLastVirtualMethod::method(int param) { return param; }";
1326    $SOURCE2 .= "
1327        int RemovedLastVirtualMethod::removedMethod(int param) { return param; }";
1328
1329    # Virtual_Table_Size
1330    $HEADER1 .= "
1331        class $DECL_SPEC VirtualTableSize
1332        {
1333        public:
1334            virtual int method1(int param);
1335            virtual int method2(int param);
1336        };
1337        class $DECL_SPEC VirtualTableSize_SubClass: public VirtualTableSize
1338        {
1339        public:
1340            virtual int method3(int param);
1341            virtual int method4(int param);
1342        };";
1343    $SOURCE1 .= "
1344        int VirtualTableSize::method1(int param) { return param; }
1345        int VirtualTableSize::method2(int param) { return param; }
1346        int VirtualTableSize_SubClass::method3(int param) { return param; }
1347        int VirtualTableSize_SubClass::method4(int param) { return param; }";
1348
1349    $HEADER2 .= "
1350        class $DECL_SPEC VirtualTableSize
1351        {
1352        public:
1353            virtual int method1(int param);
1354            virtual int method2(int param);
1355            virtual int addedMethod(int param);
1356        };
1357        class $DECL_SPEC VirtualTableSize_SubClass: public VirtualTableSize
1358        {
1359        public:
1360            virtual int method3(int param);
1361            virtual int method4(int param);
1362        };";
1363    $SOURCE2 .= "
1364        int VirtualTableSize::method1(int param) { return param; }
1365        int VirtualTableSize::method2(int param) { return param; }
1366        int VirtualTableSize::addedMethod(int param) { return param; }
1367        int VirtualTableSize_SubClass::method3(int param) { return param; }
1368        int VirtualTableSize_SubClass::method4(int param) { return param; }";
1369
1370    # Virtual_Method_Position
1371    $HEADER1 .= "
1372        class $DECL_SPEC VirtualMethodPosition
1373        {
1374        public:
1375            virtual int method1(int param);
1376            virtual int method2(int param);
1377        };";
1378    $SOURCE1 .= "
1379        int VirtualMethodPosition::method1(int param) { return param; }";
1380    $SOURCE1 .= "
1381        int VirtualMethodPosition::method2(int param) { return param; }";
1382
1383    $HEADER2 .= "
1384        class $DECL_SPEC VirtualMethodPosition
1385        {
1386        public:
1387            virtual int method2(int param);
1388            virtual int method1(int param);
1389        };";
1390    $SOURCE2 .= "
1391        int VirtualMethodPosition::method1(int param) { return param; }";
1392    $SOURCE2 .= "
1393        int VirtualMethodPosition::method2(int param) { return param; }";
1394
1395    # Pure_Virtual_Method_Position
1396    $HEADER1 .= "
1397        class $DECL_SPEC PureVirtualFunctionPosition {
1398        public:
1399            virtual int method1(int param)=0;
1400            virtual int method2(int param)=0;
1401            int method3(int param);
1402        };";
1403    $SOURCE1 .= "
1404        int PureVirtualFunctionPosition::method3(int param) { return method1(7)+method2(7); }";
1405
1406    $HEADER2 .= "
1407        class $DECL_SPEC PureVirtualFunctionPosition {
1408        public:
1409            virtual int method2(int param)=0;
1410            virtual int method1(int param)=0;
1411            int method3(int param);
1412        };";
1413    $SOURCE2 .= "
1414        int PureVirtualFunctionPosition::method3(int param) { return method1(7)+method2(7); }";
1415
1416    # Virtual_Method_Position
1417    $HEADER1 .= "
1418        class $DECL_SPEC VirtualFunctionPosition {
1419        public:
1420            virtual int method1(int param);
1421            virtual int method2(int param);
1422        };";
1423    $SOURCE1 .= "
1424        int VirtualFunctionPosition::method1(int param) { return 1; }
1425        int VirtualFunctionPosition::method2(int param) { return 2; }";
1426
1427    $HEADER2 .= "
1428        class $DECL_SPEC VirtualFunctionPosition {
1429        public:
1430            virtual int method2(int param);
1431            virtual int method1(int param);
1432        };";
1433    $SOURCE2 .= "
1434        int VirtualFunctionPosition::method1(int param) { return 1; }
1435        int VirtualFunctionPosition::method2(int param) { return 2; }";
1436
1437    # Virtual_Method_Position (safe)
1438    $HEADER1 .= "
1439        class $DECL_SPEC VirtualFunctionPositionSafe_Base {
1440        public:
1441            virtual int method1(int param);
1442            virtual int method2(int param);
1443        };
1444        class $DECL_SPEC VirtualFunctionPositionSafe: public VirtualFunctionPositionSafe_Base {
1445        public:
1446            virtual int method1(int param);
1447            virtual int method2(int param);
1448        };";
1449    $SOURCE1 .= "
1450        int VirtualFunctionPositionSafe_Base::method1(int param) { return param; }
1451        int VirtualFunctionPositionSafe_Base::method2(int param) { return param; }
1452        int VirtualFunctionPositionSafe::method1(int param) { return param; }
1453        int VirtualFunctionPositionSafe::method2(int param) { return param; }";
1454
1455    $HEADER2 .= "
1456        class $DECL_SPEC VirtualFunctionPositionSafe_Base {
1457        public:
1458            virtual int method1(int param);
1459            virtual int method2(int param);
1460        };
1461        class $DECL_SPEC VirtualFunctionPositionSafe: public VirtualFunctionPositionSafe_Base {
1462        public:
1463            virtual int method2(int param);
1464            virtual int method1(int param);
1465        };";
1466    $SOURCE2 .= "
1467        int VirtualFunctionPositionSafe_Base::method1(int param) { return param; }
1468        int VirtualFunctionPositionSafe_Base::method2(int param) { return param; }
1469        int VirtualFunctionPositionSafe::method1(int param) { return param; }
1470        int VirtualFunctionPositionSafe::method2(int param) { return param; }";
1471
1472    # Overridden_Virtual_Method
1473    $HEADER1 .= "
1474        class $DECL_SPEC OverriddenVirtualMethod_Base {
1475        public:
1476            virtual int method1(int param);
1477            virtual int method2(int param);
1478        };
1479        class $DECL_SPEC OverriddenVirtualMethod: public OverriddenVirtualMethod_Base {
1480        public:
1481            OverriddenVirtualMethod();
1482            virtual int method3(int param);
1483        };";
1484    $SOURCE1 .= "
1485        int OverriddenVirtualMethod_Base::method1(int param) { return param; }
1486        int OverriddenVirtualMethod_Base::method2(int param) { return param; }
1487        OverriddenVirtualMethod::OverriddenVirtualMethod() {}
1488        int OverriddenVirtualMethod::method3(int param) { return param; }";
1489
1490    $HEADER2 .= "
1491        class $DECL_SPEC OverriddenVirtualMethod_Base {
1492        public:
1493            virtual int method1(int param);
1494            virtual int method2(int param);
1495        };
1496        class $DECL_SPEC OverriddenVirtualMethod:public OverriddenVirtualMethod_Base {
1497            OverriddenVirtualMethod();
1498            virtual int method2(int param);
1499            virtual int method3(int param);
1500        };";
1501    $SOURCE2 .= "
1502        int OverriddenVirtualMethod_Base::method1(int param) { return param; }
1503        int OverriddenVirtualMethod_Base::method2(int param) { return param; }
1504        OverriddenVirtualMethod::OverriddenVirtualMethod() {}
1505        int OverriddenVirtualMethod::method2(int param) { return param; }
1506        int OverriddenVirtualMethod::method3(int param) { return param; }";
1507
1508    # Overridden_Virtual_Method_B (+ removed)
1509    $HEADER1 .= "
1510
1511    class $DECL_SPEC OverriddenVirtualMethodB: public OverriddenVirtualMethod_Base {
1512        public:
1513            OverriddenVirtualMethodB();
1514            virtual int method2(int param);
1515            virtual int method3(int param);
1516    };";
1517    $SOURCE1 .= "
1518        OverriddenVirtualMethodB::OverriddenVirtualMethodB() {}
1519        int OverriddenVirtualMethodB::method2(int param) { return param; }
1520        int OverriddenVirtualMethodB::method3(int param) { return param; }";
1521
1522    $HEADER2 .= "
1523
1524    class $DECL_SPEC OverriddenVirtualMethodB:public OverriddenVirtualMethod_Base {
1525        public:
1526            OverriddenVirtualMethodB();
1527            virtual int method3(int param);
1528    };";
1529    $SOURCE2 .= "
1530        OverriddenVirtualMethodB::OverriddenVirtualMethodB() {}
1531        int OverriddenVirtualMethodB::method3(int param) { return param; }";
1532
1533    # Size
1534    $HEADER1 .= "
1535        struct $DECL_SPEC TypeSize
1536        {
1537        public:
1538            TypeSize method(TypeSize param);
1539            int i[5];
1540            long j;
1541            double k;
1542            TypeSize* p;
1543        };";
1544    $SOURCE1 .= "
1545        TypeSize TypeSize::method(TypeSize param) { return param; }";
1546
1547    $HEADER2 .= "
1548        struct $DECL_SPEC TypeSize
1549        {
1550        public:
1551            TypeSize method(TypeSize param);
1552            int i[15];
1553            long j;
1554            double k;
1555            TypeSize* p;
1556            int added_member;
1557        };";
1558    $SOURCE2 .= "
1559        TypeSize TypeSize::method(TypeSize param) { return param; }";
1560
1561    # Size_Of_Allocable_Class_Increased
1562    $HEADER1 .= "
1563        class $DECL_SPEC AllocableClassSize
1564        {
1565        public:
1566            AllocableClassSize();
1567            int method();
1568            double p[5];
1569        };";
1570    $SOURCE1 .= "
1571        AllocableClassSize::AllocableClassSize() { }";
1572    $SOURCE1 .= "
1573        int AllocableClassSize::method() { return 0; }";
1574
1575    $HEADER2 .= "
1576        struct $DECL_SPEC AllocableClassSize
1577        {
1578        public:
1579            AllocableClassSize();
1580            int method();
1581            double p[15];
1582        };";
1583    $SOURCE2 .= "
1584        AllocableClassSize::AllocableClassSize() { }";
1585    $SOURCE2 .= "
1586        int AllocableClassSize::method() { return 0; }";
1587
1588    # Size_Of_Allocable_Class_Decreased (decreased size, has derived class, has public members)
1589    $HEADER1 .= "
1590        class $DECL_SPEC DecreasedClassSize
1591        {
1592        public:
1593            DecreasedClassSize();
1594            int method();
1595            double p[15];
1596        };";
1597    $SOURCE1 .= "
1598        DecreasedClassSize::DecreasedClassSize() { }";
1599    $SOURCE1 .= "
1600        int DecreasedClassSize::method() { return 0; }";
1601    $HEADER1 .= "
1602        class $DECL_SPEC DecreasedClassSize_SubClass: public DecreasedClassSize
1603        {
1604        public:
1605            DecreasedClassSize_SubClass();
1606            int method();
1607            int f;
1608        };";
1609    $SOURCE1 .= "
1610        DecreasedClassSize_SubClass::DecreasedClassSize_SubClass() { f=7; }";
1611    $SOURCE1 .= "
1612        int DecreasedClassSize_SubClass::method() { return f; }";
1613
1614    $HEADER2 .= "
1615        struct $DECL_SPEC DecreasedClassSize
1616        {
1617        public:
1618            DecreasedClassSize();
1619            int method();
1620            double p[5];
1621        };";
1622    $SOURCE2 .= "
1623        DecreasedClassSize::DecreasedClassSize() { }";
1624    $SOURCE2 .= "
1625        int DecreasedClassSize::method() { return 0; }";
1626    $HEADER2 .= "
1627        class $DECL_SPEC DecreasedClassSize_SubClass: public DecreasedClassSize
1628        {
1629        public:
1630            DecreasedClassSize_SubClass();
1631            int method();
1632            int f;
1633        };";
1634    $SOURCE2 .= "
1635        DecreasedClassSize_SubClass::DecreasedClassSize_SubClass() { f=7; }";
1636    $SOURCE2 .= "
1637        int DecreasedClassSize_SubClass::method() { return f; }";
1638
1639    # Size_Of_Copying_Class
1640    $HEADER1 .= "
1641        class $DECL_SPEC CopyingClassSize
1642        {
1643        public:
1644            int method();
1645            int p[5];
1646        };";
1647    $SOURCE1 .= "
1648        int CopyingClassSize::method() { return p[4]; }";
1649
1650    $HEADER2 .= "
1651        struct $DECL_SPEC CopyingClassSize
1652        {
1653        public:
1654            int method();
1655            int p[15];
1656        };";
1657    $SOURCE2 .= "
1658        int CopyingClassSize::method() { return p[10]; }";
1659
1660    # Base_Class_Became_Virtually_Inherited
1661    $HEADER1 .= "
1662        class $DECL_SPEC BecameVirtualBase
1663        {
1664        public:
1665            BecameVirtualBase();
1666            int method();
1667            double p[5];
1668        };";
1669    $SOURCE1 .= "
1670        BecameVirtualBase::BecameVirtualBase() { }";
1671    $SOURCE1 .= "
1672        int BecameVirtualBase::method() { return 0; }";
1673    $HEADER1 .= "
1674        class $DECL_SPEC AddedVirtualBase1:public BecameVirtualBase
1675        {
1676        public:
1677            AddedVirtualBase1();
1678            int method();
1679        };";
1680    $SOURCE1 .= "
1681        AddedVirtualBase1::AddedVirtualBase1() { }";
1682    $SOURCE1 .= "
1683        int AddedVirtualBase1::method() { return 0; }";
1684    $HEADER1 .= "
1685        class $DECL_SPEC AddedVirtualBase2: public BecameVirtualBase
1686        {
1687        public:
1688            AddedVirtualBase2();
1689            int method();
1690        };";
1691    $SOURCE1 .= "
1692        AddedVirtualBase2::AddedVirtualBase2() { }";
1693    $SOURCE1 .= "
1694        int AddedVirtualBase2::method() { return 0; }";
1695    $HEADER1 .= "
1696        class $DECL_SPEC BaseClassBecameVirtuallyInherited:public AddedVirtualBase1, public AddedVirtualBase2
1697        {
1698        public:
1699            BaseClassBecameVirtuallyInherited();
1700        };";
1701    $SOURCE1 .= "
1702        BaseClassBecameVirtuallyInherited::BaseClassBecameVirtuallyInherited() { }";
1703
1704    $HEADER2 .= "
1705        class $DECL_SPEC BecameVirtualBase
1706        {
1707        public:
1708            BecameVirtualBase();
1709            int method();
1710            double p[5];
1711        };";
1712    $SOURCE2 .= "
1713        BecameVirtualBase::BecameVirtualBase() { }";
1714    $SOURCE2 .= "
1715        int BecameVirtualBase::method() { return 0; }";
1716    $HEADER2 .= "
1717        class $DECL_SPEC AddedVirtualBase1:public virtual BecameVirtualBase
1718        {
1719        public:
1720            AddedVirtualBase1();
1721            int method();
1722        };";
1723    $SOURCE2 .= "
1724        AddedVirtualBase1::AddedVirtualBase1() { }";
1725    $SOURCE2 .= "
1726        int AddedVirtualBase1::method() { return 0; }";
1727    $HEADER2 .= "
1728        class $DECL_SPEC AddedVirtualBase2: public virtual BecameVirtualBase
1729        {
1730        public:
1731            AddedVirtualBase2();
1732            int method();
1733        };";
1734    $SOURCE2 .= "
1735        AddedVirtualBase2::AddedVirtualBase2() { }";
1736    $SOURCE2 .= "
1737        int AddedVirtualBase2::method() { return 0; }";
1738    $HEADER2 .= "
1739        class $DECL_SPEC BaseClassBecameVirtuallyInherited:public AddedVirtualBase1, public AddedVirtualBase2
1740        {
1741        public:
1742            BaseClassBecameVirtuallyInherited();
1743        };";
1744    $SOURCE2 .= "
1745        BaseClassBecameVirtuallyInherited::BaseClassBecameVirtuallyInherited() { }";
1746
1747    # Added_Base_Class, Removed_Base_Class
1748    $HEADER1 .= "
1749        class $DECL_SPEC BaseClass
1750        {
1751        public:
1752            BaseClass();
1753            int method();
1754            double p[5];
1755        };
1756        class $DECL_SPEC RemovedBaseClass
1757        {
1758        public:
1759            RemovedBaseClass();
1760            int method();
1761        };
1762        class $DECL_SPEC ChangedBaseClass:public BaseClass, public RemovedBaseClass
1763        {
1764        public:
1765            ChangedBaseClass();
1766        };";
1767    $SOURCE1 .= "
1768        BaseClass::BaseClass() { }
1769        int BaseClass::method() { return 0; }
1770        RemovedBaseClass::RemovedBaseClass() { }
1771        int RemovedBaseClass::method() { return 0; }
1772        ChangedBaseClass::ChangedBaseClass() { }";
1773
1774    $HEADER2 .= "
1775        class $DECL_SPEC BaseClass
1776        {
1777        public:
1778            BaseClass();
1779            int method();
1780            double p[5];
1781        };
1782        class $DECL_SPEC AddedBaseClass
1783        {
1784        public:
1785            AddedBaseClass();
1786            int method();
1787        };
1788        class $DECL_SPEC ChangedBaseClass:public BaseClass, public AddedBaseClass
1789        {
1790        public:
1791            ChangedBaseClass();
1792        };";
1793    $SOURCE2 .= "
1794        BaseClass::BaseClass() { }
1795        int BaseClass::method() { return 0; }
1796        AddedBaseClass::AddedBaseClass() { }
1797        int AddedBaseClass::method() { return 0; }
1798        ChangedBaseClass::ChangedBaseClass() { }";
1799
1800    # Added_Base_Class_And_Shift, Removed_Base_Class_And_Shift
1801    $HEADER1 .= "
1802        struct $DECL_SPEC BaseClass2
1803        {
1804            BaseClass2();
1805            int method();
1806            double p[15];
1807        };
1808        class $DECL_SPEC ChangedBaseClassAndSize:public BaseClass
1809        {
1810        public:
1811            ChangedBaseClassAndSize();
1812        };";
1813    $SOURCE1 .= "
1814        BaseClass2::BaseClass2() { }
1815        int BaseClass2::method() { return 0; }
1816        ChangedBaseClassAndSize::ChangedBaseClassAndSize() { }";
1817
1818    $HEADER2 .= "
1819        struct $DECL_SPEC BaseClass2
1820        {
1821            BaseClass2();
1822            int method();
1823            double p[15];
1824        };
1825        class $DECL_SPEC ChangedBaseClassAndSize:public BaseClass2
1826        {
1827        public:
1828            ChangedBaseClassAndSize();
1829        };";
1830    $SOURCE2 .= "
1831        BaseClass2::BaseClass2() { }
1832        int BaseClass2::method() { return 0; }
1833        ChangedBaseClassAndSize::ChangedBaseClassAndSize() { }";
1834
1835    # Added_Field_And_Size
1836    $HEADER1 .= "
1837        struct $DECL_SPEC AddedFieldAndSize
1838        {
1839            int method(AddedFieldAndSize param);
1840            double i, j, k;
1841            AddedFieldAndSize* p;
1842        };";
1843    $SOURCE1 .= "
1844        int AddedFieldAndSize::method(AddedFieldAndSize param) { return 0; }";
1845
1846    $HEADER2 .= "
1847        struct $DECL_SPEC AddedFieldAndSize
1848        {
1849            int method(AddedFieldAndSize param);
1850            double i, j, k;
1851            AddedFieldAndSize* p;
1852            int added_member1;
1853            long long added_member2;
1854        };";
1855    $SOURCE2 .= "
1856        int AddedFieldAndSize::method(AddedFieldAndSize param) { return 0; }";
1857
1858    # Added_Field
1859    $HEADER1 .= "
1860        class $DECL_SPEC ObjectAddedMember
1861        {
1862        public:
1863            int method(int param);
1864            double i, j, k;
1865            AddedFieldAndSize* p;
1866        };";
1867    $SOURCE1 .= "
1868        int ObjectAddedMember::method(int param) { return param; }";
1869
1870    $HEADER2 .= "
1871        class $DECL_SPEC ObjectAddedMember
1872        {
1873        public:
1874            int method(int param);
1875            double i, j, k;
1876            AddedFieldAndSize* p;
1877            int added_member1;
1878            long long added_member2;
1879        };";
1880    $SOURCE2 .= "
1881        int ObjectAddedMember::method(int param) { return param; }";
1882
1883    # Added_Field (safe)
1884    $HEADER1 .= "
1885        struct $DECL_SPEC AddedBitfield
1886        {
1887            int method(AddedBitfield param);
1888            double i, j, k;
1889            int b1 : 32;
1890            int b2 : 31;
1891            AddedBitfield* p;
1892        };";
1893    $SOURCE1 .= "
1894        int AddedBitfield::method(AddedBitfield param) { return 0; }";
1895
1896    $HEADER2 .= "
1897        struct $DECL_SPEC AddedBitfield
1898        {
1899            int method(AddedBitfield param);
1900            double i, j, k;
1901            int b1 : 32;
1902            int b2 : 31;
1903            int added_bitfield : 1;
1904            int added_bitfield2 : 1;
1905            AddedBitfield* p;
1906        };";
1907    $SOURCE2 .= "
1908        int AddedBitfield::method(AddedBitfield param) { return 0; }";
1909
1910    # Bit_Field_Size
1911    $HEADER1 .= "
1912        struct $DECL_SPEC BitfieldSize
1913        {
1914            int method(BitfieldSize param);
1915            short changed_bitfield : 1;
1916        };";
1917    $SOURCE1 .= "
1918        int BitfieldSize::method(BitfieldSize param) { return 0; }";
1919
1920    $HEADER2 .= "
1921        struct $DECL_SPEC BitfieldSize
1922        {
1923            int method(BitfieldSize param);
1924            short changed_bitfield : 7;
1925        };";
1926    $SOURCE2 .= "
1927        int BitfieldSize::method(BitfieldSize param) { return 0; }";
1928
1929    # Removed_Field
1930    $HEADER1 .= "
1931        struct $DECL_SPEC RemovedBitfield
1932        {
1933            int method(RemovedBitfield param);
1934            double i, j, k;
1935            int b1 : 32;
1936            int b2 : 31;
1937            int removed_bitfield : 1;
1938            RemovedBitfield* p;
1939        };";
1940    $SOURCE1 .= "
1941        int RemovedBitfield::method(RemovedBitfield param) { return 0; }";
1942
1943    $HEADER2 .= "
1944        struct $DECL_SPEC RemovedBitfield
1945        {
1946            int method(RemovedBitfield param);
1947            double i, j, k;
1948            int b1 : 32;
1949            int b2 : 31;
1950            RemovedBitfield* p;
1951        };";
1952    $SOURCE2 .= "
1953        int RemovedBitfield::method(RemovedBitfield param) { return 0; }";
1954
1955    # Removed_Middle_Field
1956    $HEADER1 .= "
1957        struct $DECL_SPEC RemovedMiddleBitfield
1958        {
1959            int method(RemovedMiddleBitfield param);
1960            double i, j, k;
1961            int b1 : 32;
1962            int removed_middle_bitfield : 1;
1963            int b2 : 31;
1964            RemovedMiddleBitfield* p;
1965        };";
1966    $SOURCE1 .= "
1967        int RemovedMiddleBitfield::method(RemovedMiddleBitfield param) { return 0; }";
1968
1969    $HEADER2 .= "
1970        struct $DECL_SPEC RemovedMiddleBitfield
1971        {
1972            int method(RemovedMiddleBitfield param);
1973            double i, j, k;
1974            int b1 : 32;
1975            int b2 : 31;
1976            RemovedMiddleBitfield* p;
1977        };";
1978    $SOURCE2 .= "
1979        int RemovedMiddleBitfield::method(RemovedMiddleBitfield param) { return 0; }";
1980
1981    # Added_Middle_Field_And_Size
1982    $HEADER1 .= "
1983        struct $DECL_SPEC AddedMiddleFieldAndSize
1984        {
1985            int method(AddedMiddleFieldAndSize param);
1986            int i;
1987            long j;
1988            double k;
1989            AddedMiddleFieldAndSize* p;
1990        };";
1991    $SOURCE1 .= "
1992        int AddedMiddleFieldAndSize::method(AddedMiddleFieldAndSize param) { return 0; }";
1993
1994    $HEADER2 .= "
1995        struct $DECL_SPEC AddedMiddleFieldAndSize
1996        {
1997            int method(AddedMiddleFieldAndSize param);
1998            int i;
1999            int added_middle_member;
2000            long j;
2001            double k;
2002            AddedMiddleFieldAndSize* p;
2003        };";
2004    $SOURCE2 .= "
2005        int AddedMiddleFieldAndSize::method(AddedMiddleFieldAndSize param) { return 0; }";
2006
2007    # Added_Field (padding)
2008    $HEADER1 .= "
2009        struct $DECL_SPEC AddedMiddlePaddedField
2010        {
2011            int method(int param);
2012            short i;
2013            long j;
2014            double k;
2015        };";
2016    $SOURCE1 .= "
2017        int AddedMiddlePaddedField::method(int param) { return 0; }";
2018
2019    $HEADER2 .= "
2020        struct $DECL_SPEC AddedMiddlePaddedField
2021        {
2022            int method(int param);
2023            short i;
2024            short added_padded_field;
2025            long j;
2026            double k;
2027        };";
2028    $SOURCE2 .= "
2029        int AddedMiddlePaddedField::method(int param) { return 0; }";
2030
2031    # Added_Field (tail padding)
2032    $HEADER1 .= "
2033        struct $DECL_SPEC AddedTailField
2034        {
2035            int method(int param);
2036            int i1, i2, i3, i4, i5, i6, i7;
2037            short s;
2038        };";
2039    $SOURCE1 .= "
2040        int AddedTailField::method(int param) { return 0; }";
2041
2042    $HEADER2 .= "
2043        struct $DECL_SPEC AddedTailField
2044        {
2045            int method(int param);
2046            int i1, i2, i3, i4, i5, i6, i7;
2047            short s;
2048            short added_tail_field;
2049        };";
2050    $SOURCE2 .= "
2051        int AddedTailField::method(int param) { return 0; }";
2052
2053    # Test Alignment
2054    $HEADER1 .= "
2055        struct $DECL_SPEC TestAlignment
2056        {
2057            int method(int param);
2058            short s:9;
2059            short   j:9;
2060            char  c;
2061            short t:9;
2062            short u:9;
2063            char d;
2064        };";
2065    $SOURCE1 .= "
2066        int TestAlignment::method(int param) { return 0; }";
2067
2068    $HEADER2 .= "
2069        struct $DECL_SPEC TestAlignment
2070        {
2071            int method(int param);
2072            short s:9;
2073            short   j:9;
2074            char  c;
2075            short t:9;
2076            short u:9;
2077            char d;
2078        };";
2079    $SOURCE2 .= "
2080        int TestAlignment::method(int param) { return 0; }";
2081
2082    # Renamed_Field
2083    $HEADER1 .= "
2084        struct $DECL_SPEC RenamedField
2085        {
2086            int method(RenamedField param);
2087            long i;
2088            long j;
2089            double k;
2090            RenamedField* p;
2091        };";
2092    $SOURCE1 .= "
2093        int RenamedField::method(RenamedField param) { return 0; }";
2094
2095    $HEADER2 .= "
2096        struct $DECL_SPEC RenamedField
2097        {
2098            int method(RenamedField param);
2099            long renamed_member;
2100            long j;
2101            double k;
2102            RenamedField* p;
2103        };";
2104    $SOURCE2 .= "
2105        int RenamedField::method(RenamedField param) { return 0; }";
2106
2107    # Removed_Field_And_Size
2108    $HEADER1 .= "
2109        struct $DECL_SPEC RemovedFieldAndSize
2110        {
2111            int method(RemovedFieldAndSize param);
2112            double i, j, k;
2113            RemovedFieldAndSize* p;
2114            int removed_member1;
2115            long removed_member2;
2116        };";
2117    $SOURCE1 .= "
2118        int RemovedFieldAndSize::method(RemovedFieldAndSize param) { return 0; }";
2119
2120    $HEADER2 .= "
2121        struct $DECL_SPEC RemovedFieldAndSize
2122        {
2123            int method(RemovedFieldAndSize param);
2124            double i, j, k;
2125            RemovedFieldAndSize* p;
2126        };";
2127    $SOURCE2 .= "
2128        int RemovedFieldAndSize::method(RemovedFieldAndSize param) { return 0; }";
2129
2130    # Field Position
2131    $HEADER1 .= "
2132        struct $DECL_SPEC MovedField
2133        {
2134            int method(int param);
2135            double i;
2136            int j;
2137        };";
2138    $SOURCE1 .= "
2139        int MovedField::method(int param) { return 0; }";
2140
2141    $HEADER2 .= "
2142        struct $DECL_SPEC MovedField
2143        {
2144            int method(int param);
2145            int j;
2146            double i;
2147        };";
2148    $SOURCE2 .= "
2149        int MovedField::method(int param) { return 0; }";
2150
2151    # Removed_Middle_Field_And_Size
2152    $HEADER1 .= "
2153        struct $DECL_SPEC RemovedMiddleFieldAndSize
2154        {
2155            int method(RemovedMiddleFieldAndSize param);
2156            int i;
2157            int removed_middle_member;
2158            long j;
2159            double k;
2160            RemovedMiddleFieldAndSize* p;
2161        };";
2162    $SOURCE1 .= "
2163        int RemovedMiddleFieldAndSize::method(RemovedMiddleFieldAndSize param) { return 0; }";
2164
2165    $HEADER2 .= "
2166        struct $DECL_SPEC RemovedMiddleFieldAndSize
2167        {
2168            int method(RemovedMiddleFieldAndSize param);
2169            int i;
2170            long j;
2171            double k;
2172            RemovedMiddleFieldAndSize* p;
2173        };";
2174    $SOURCE2 .= "
2175        int RemovedMiddleFieldAndSize::method(RemovedMiddleFieldAndSize param) { return 0; }";
2176
2177    # Enum_Member_Value
2178    $HEADER1 .= "
2179        enum EnumMemberValue
2180        {
2181            MEMBER_1=1,
2182            MEMBER_2=2
2183        };";
2184    $HEADER1 .= "
2185        $DECL_SPEC int enumMemberValueChange(enum EnumMemberValue param);";
2186    $SOURCE1 .= "
2187        int enumMemberValueChange(enum EnumMemberValue param) { return 0; }";
2188
2189    $HEADER2 .= "
2190        enum EnumMemberValue
2191        {
2192            MEMBER_1=2,
2193            MEMBER_2=1
2194        };";
2195    $HEADER2 .= "
2196        $DECL_SPEC int enumMemberValueChange(enum EnumMemberValue param);";
2197    $SOURCE2 .= "
2198        int enumMemberValueChange(enum EnumMemberValue param) { return 0; }";
2199
2200    # Enum_Member_Name
2201    $HEADER1 .= "
2202        enum EnumMemberRename
2203        {
2204            BRANCH_1=1,
2205            BRANCH_2=2
2206        };";
2207    $HEADER1 .= "
2208        $DECL_SPEC int enumMemberRename(enum EnumMemberRename param);";
2209    $SOURCE1 .= "
2210        int enumMemberRename(enum EnumMemberRename param) { return 0; }";
2211
2212    $HEADER2 .= "
2213        enum EnumMemberRename
2214        {
2215            BRANCH_FIRST=1,
2216            BRANCH_SECOND=2
2217        };";
2218    $HEADER2 .= "
2219        $DECL_SPEC int enumMemberRename(enum EnumMemberRename param);";
2220    $SOURCE2 .= "
2221        int enumMemberRename(enum EnumMemberRename param) { return 0; }";
2222
2223    # Field_Type_And_Size
2224    $HEADER1 .= "
2225        struct $DECL_SPEC FieldTypeAndSize
2226        {
2227            int method(FieldTypeAndSize param);
2228            int i;
2229            long j;
2230            double k;
2231            FieldTypeAndSize* p;
2232        };";
2233    $SOURCE1 .= "
2234        int FieldTypeAndSize::method(FieldTypeAndSize param) { return 0; }";
2235
2236    $HEADER2 .= "
2237        struct $DECL_SPEC FieldTypeAndSize
2238        {
2239            int method(FieldTypeAndSize param);
2240            long long i;
2241            long j;
2242            double k;
2243            FieldTypeAndSize* p;
2244        };";
2245    $SOURCE2 .= "
2246        int FieldTypeAndSize::method(FieldTypeAndSize param) { return 0; }";
2247
2248    # Member_Type
2249    $HEADER1 .= "
2250        struct $DECL_SPEC MemberType
2251        {
2252            int method(MemberType param);
2253            int i;
2254            long j;
2255            double k;
2256            MemberType* p;
2257        };";
2258    $SOURCE1 .= "
2259        int MemberType::method(MemberType param) { return 0; }";
2260
2261    $HEADER2 .= "
2262        struct $DECL_SPEC MemberType
2263        {
2264            int method(MemberType param);
2265            float i;
2266            long j;
2267            double k;
2268            MemberType* p;
2269        };";
2270    $SOURCE2 .= "
2271        int MemberType::method(MemberType param) { return 0; }";
2272
2273    # Field_BaseType
2274    $HEADER1 .= "
2275        struct $DECL_SPEC FieldBaseType
2276        {
2277            int method(FieldBaseType param);
2278            int *i;
2279            long j;
2280            double k;
2281            FieldBaseType* p;
2282        };";
2283    $SOURCE1 .= "
2284        int FieldBaseType::method(FieldBaseType param) { return 0; }";
2285
2286    $HEADER2 .= "
2287        struct $DECL_SPEC FieldBaseType
2288        {
2289            int method(FieldBaseType param);
2290            long long *i;
2291            long j;
2292            double k;
2293            FieldBaseType* p;
2294        };";
2295    $SOURCE2 .= "
2296        int FieldBaseType::method(FieldBaseType param) { return 0; }";
2297
2298    # Field_PointerLevel_Increased (and size)
2299    $HEADER1 .= "
2300        struct $DECL_SPEC FieldPointerLevelAndSize
2301        {
2302            int method(FieldPointerLevelAndSize param);
2303            long long i;
2304            long j;
2305            double k;
2306            FieldPointerLevelAndSize* p;
2307        };";
2308    $SOURCE1 .= "
2309        int FieldPointerLevelAndSize::method(FieldPointerLevelAndSize param) { return 0; }";
2310
2311    $HEADER2 .= "
2312        struct $DECL_SPEC FieldPointerLevelAndSize
2313        {
2314            int method(FieldPointerLevelAndSize param);
2315            long long *i;
2316            long j;
2317            double k;
2318            FieldPointerLevelAndSize* p;
2319        };";
2320    $SOURCE2 .= "
2321        int FieldPointerLevelAndSize::method(FieldPointerLevelAndSize param) { return 0; }";
2322
2323    # Field_PointerLevel
2324    $HEADER1 .= "
2325        struct $DECL_SPEC FieldPointerLevel
2326        {
2327            int method(FieldPointerLevel param);
2328            int **i;
2329            long j;
2330            double k;
2331            FieldPointerLevel* p;
2332        };";
2333    $SOURCE1 .= "
2334        int FieldPointerLevel::method(FieldPointerLevel param) { return 0; }";
2335
2336    $HEADER2 .= "
2337        struct $DECL_SPEC FieldPointerLevel
2338        {
2339            int method(FieldPointerLevel param);
2340            int *i;
2341            long j;
2342            double k;
2343            FieldPointerLevel* p;
2344        };";
2345    $SOURCE2 .= "
2346        int FieldPointerLevel::method(FieldPointerLevel param) { return 0; }";
2347
2348    # Added_Interface (method)
2349    $HEADER1 .= "
2350        struct $DECL_SPEC AddedInterface
2351        {
2352            int method(AddedInterface param);
2353            int i;
2354            long j;
2355            double k;
2356            AddedInterface* p;
2357        };";
2358    $SOURCE1 .= "
2359        int AddedInterface::method(AddedInterface param) { return 0; }";
2360
2361    $HEADER2 .= "
2362        struct $DECL_SPEC AddedInterface
2363        {
2364            int method(AddedInterface param);
2365            int added_func(AddedInterface param);
2366            int i;
2367            long j;
2368            double k;
2369            AddedInterface* p;
2370        };";
2371    $SOURCE2 .= "
2372        int AddedInterface::method(AddedInterface param) { return 0; }";
2373    $SOURCE2 .= "
2374        int AddedInterface::added_func(AddedInterface param) { return 0; }";
2375
2376    # Added_Interface (function)
2377    $HEADER2 .= "
2378        $DECL_SPEC int addedFunc2(void *** param);";
2379    $SOURCE2 .= "
2380        int addedFunc2(void *** param) { return 0; }";
2381
2382    # Added_Interface (global variable)
2383    $HEADER1 .= "
2384        struct $DECL_SPEC AddedVariable
2385        {
2386            int method(AddedVariable param);
2387            int i1, i2;
2388            long j;
2389            double k;
2390            AddedVariable* p;
2391        };";
2392    $SOURCE1 .= "
2393        int AddedVariable::method(AddedVariable param) {
2394            return i1;
2395        }";
2396
2397    $HEADER2 .= "
2398        struct $DECL_SPEC AddedVariable
2399        {
2400            int method(AddedVariable param);
2401            static int i1;
2402            static int i2;
2403            long j;
2404            double k;
2405            AddedVariable* p;
2406        };";
2407    $SOURCE2 .= "
2408        int AddedVariable::method(AddedVariable param) { return AddedVariable::i1; }";
2409    $SOURCE2 .= "
2410        int AddedVariable::i1=0;";
2411    $SOURCE2 .= "
2412        int AddedVariable::i2=0;";
2413
2414    # Removed_Interface (method)
2415    $HEADER1 .= "
2416        struct $DECL_SPEC RemovedInterface
2417        {
2418            int method(RemovedInterface param);
2419            int removed_func(RemovedInterface param);
2420            int i;
2421            long j;
2422            double k;
2423            RemovedInterface* p;
2424        };";
2425    $SOURCE1 .= "
2426        int RemovedInterface::method(RemovedInterface param) { return 0; }";
2427    $SOURCE1 .= "
2428        int RemovedInterface::removed_func(RemovedInterface param) { return 0; }";
2429
2430    $HEADER2 .= "
2431        struct $DECL_SPEC RemovedInterface
2432        {
2433            int method(RemovedInterface param);
2434            int i;
2435            long j;
2436            double k;
2437            RemovedInterface* p;
2438        };";
2439    $SOURCE2 .= "
2440        int RemovedInterface::method(RemovedInterface param) { return 0; }";
2441
2442    # Removed_Interface (function)
2443    $HEADER1 .= "
2444        $DECL_SPEC int removedFunc2(void *** param);";
2445    $SOURCE1 .= "
2446        int removedFunc2(void *** param) { return 0; }";
2447
2448    # Method_Became_Static
2449    $HEADER1 .= "
2450        struct $DECL_SPEC MethodBecameStatic
2451        {
2452            MethodBecameStatic becameStatic(MethodBecameStatic param);
2453            int **i;
2454            long j;
2455            double k;
2456            MethodBecameStatic* p;
2457        };";
2458    $SOURCE1 .= "
2459        MethodBecameStatic MethodBecameStatic::becameStatic(MethodBecameStatic param) { return param; }";
2460
2461    $HEADER2 .= "
2462        struct $DECL_SPEC MethodBecameStatic
2463        {
2464            static MethodBecameStatic becameStatic(MethodBecameStatic param);
2465            int **i;
2466            long j;
2467            double k;
2468            MethodBecameStatic* p;
2469        };";
2470    $SOURCE2 .= "
2471        MethodBecameStatic MethodBecameStatic::becameStatic(MethodBecameStatic param) { return param; }";
2472
2473    # Method_Became_Non_Static
2474    $HEADER1 .= "
2475        struct $DECL_SPEC MethodBecameNonStatic
2476        {
2477            static MethodBecameNonStatic becameNonStatic(MethodBecameNonStatic param);
2478            int **i;
2479            long j;
2480            double k;
2481            MethodBecameNonStatic* p;
2482        };";
2483    $SOURCE1 .= "
2484        MethodBecameNonStatic MethodBecameNonStatic::becameNonStatic(MethodBecameNonStatic param) { return param; }";
2485
2486    $HEADER2 .= "
2487        struct $DECL_SPEC MethodBecameNonStatic
2488        {
2489            MethodBecameNonStatic becameNonStatic(MethodBecameNonStatic param);
2490            int **i;
2491            long j;
2492            double k;
2493            MethodBecameNonStatic* p;
2494        };";
2495    $SOURCE2 .= "
2496        MethodBecameNonStatic MethodBecameNonStatic::becameNonStatic(MethodBecameNonStatic param) { return param; }";
2497
2498    # Parameter_Type_And_Size
2499    $HEADER1 .= "
2500        $DECL_SPEC int funcParameterTypeAndSize(int param, int other_param);";
2501    $SOURCE1 .= "
2502        int funcParameterTypeAndSize(int param, int other_param) { return other_param; }";
2503
2504    $HEADER2 .= "
2505        $DECL_SPEC int funcParameterTypeAndSize(long long param, int other_param);";
2506    $SOURCE2 .= "
2507        int funcParameterTypeAndSize(long long param, int other_param) { return other_param; }";
2508
2509    # Parameter_Type
2510    $HEADER1 .= "
2511        $DECL_SPEC int funcParameterType(int param, int other_param);";
2512    $SOURCE1 .= "
2513        int funcParameterType(int param, int other_param) { return other_param; }";
2514
2515    $HEADER2 .= "
2516        $DECL_SPEC int funcParameterType(float param, int other_param);";
2517    $SOURCE2 .= "
2518        int funcParameterType(float param, int other_param) { return other_param; }";
2519
2520    # Parameter_BaseType
2521    $HEADER1 .= "
2522        $DECL_SPEC int funcParameterBaseType(int *param);";
2523    $SOURCE1 .= "
2524        int funcParameterBaseType(int *param) { return sizeof(*param); }";
2525
2526    $HEADER2 .= "
2527        $DECL_SPEC int funcParameterBaseType(long long *param);";
2528    $SOURCE2 .= "
2529        int funcParameterBaseType(long long *param) { return sizeof(*param); }";
2530
2531    # Parameter_PointerLevel
2532    $HEADER1 .= "
2533        $DECL_SPEC long long funcParameterPointerLevelAndSize(long long param);";
2534    $SOURCE1 .= "
2535        long long funcParameterPointerLevelAndSize(long long param) { return param; }";
2536
2537    $HEADER2 .= "
2538        $DECL_SPEC long long funcParameterPointerLevelAndSize(long long *param);";
2539    $SOURCE2 .= "
2540        long long funcParameterPointerLevelAndSize(long long *param) { return param[5]; }";
2541
2542    # Parameter_PointerLevel
2543    $HEADER1 .= "
2544        $DECL_SPEC int funcParameterPointerLevel(int *param);";
2545    $SOURCE1 .= "
2546        int funcParameterPointerLevel(int *param) { return param[5]; }";
2547
2548    $HEADER2 .= "
2549        $DECL_SPEC int funcParameterPointerLevel(int **param);";
2550    $SOURCE2 .= "
2551        int funcParameterPointerLevel(int **param) { return param[5][5]; }";
2552
2553    # Return_Type_And_Size
2554    $HEADER1 .= "
2555        $DECL_SPEC int funcReturnTypeAndSize(int param);";
2556    $SOURCE1 .= "
2557        int funcReturnTypeAndSize(int param) { return 0; }";
2558
2559    $HEADER2 .= "
2560        $DECL_SPEC long long funcReturnTypeAndSize(int param);";
2561    $SOURCE2 .= "
2562        long long funcReturnTypeAndSize(int param) { return 0; }";
2563
2564    # Return_Type
2565    $HEADER1 .= "
2566        $DECL_SPEC int funcReturnType(int param);";
2567    $SOURCE1 .= "
2568        int funcReturnType(int param) { return 0; }";
2569
2570    $HEADER2 .= "
2571        $DECL_SPEC float funcReturnType(int param);";
2572    $SOURCE2 .= "
2573        float funcReturnType(int param) { return 0.7; }";
2574
2575    # Return_Type_Became_Void ("int" to "void")
2576    $HEADER1 .= "
2577        $DECL_SPEC int funcReturnTypeBecameVoid(int param);";
2578    $SOURCE1 .= "
2579        int funcReturnTypeBecameVoid(int param) { return 0; }";
2580
2581    $HEADER2 .= "
2582        $DECL_SPEC void funcReturnTypeBecameVoid(int param);";
2583    $SOURCE2 .= "
2584        void funcReturnTypeBecameVoid(int param) { return; }";
2585
2586    # Return_BaseType
2587    $HEADER1 .= "
2588        $DECL_SPEC int* funcReturnBaseType(int param);";
2589    $SOURCE1 .= "
2590        int* funcReturnBaseType(int param) {
2591            int *x = new int[10];
2592            return x;
2593        }";
2594
2595    $HEADER2 .= "
2596        $DECL_SPEC long long* funcReturnBaseType(int param);";
2597    $SOURCE2 .= "
2598        long long* funcReturnBaseType(int param) {
2599            long long *x = new long long[10];
2600            return x;
2601        }";
2602
2603    # Return_PointerLevel
2604    $HEADER1 .= "
2605        $DECL_SPEC long long funcReturnPointerLevelAndSize(int param);";
2606    $SOURCE1 .= "
2607        long long funcReturnPointerLevelAndSize(int param) { return 0; }";
2608
2609    $HEADER2 .= "
2610        $DECL_SPEC long long* funcReturnPointerLevelAndSize(int param);";
2611    $SOURCE2 .= "
2612        long long* funcReturnPointerLevelAndSize(int param) { return new long long[10]; }";
2613
2614    # Return_PointerLevel
2615    $HEADER1 .= "
2616        $DECL_SPEC int* funcReturnPointerLevel(int param);";
2617    $SOURCE1 .= "
2618        int* funcReturnPointerLevel(int param) { return new int[10]; }";
2619
2620    $HEADER2 .= "
2621        $DECL_SPEC int** funcReturnPointerLevel(int param);";
2622    $SOURCE2 .= "
2623        int** funcReturnPointerLevel(int param) { return new int*[10]; }";
2624
2625    # Size (anon type)
2626    $HEADER1 .= "
2627        typedef struct {
2628            int i;
2629            long j;
2630            double k;
2631        } AnonTypedef;
2632        $DECL_SPEC int funcAnonTypedef(AnonTypedef param);";
2633    $SOURCE1 .= "
2634        int funcAnonTypedef(AnonTypedef param) { return 0; }";
2635
2636    $HEADER2 .= "
2637        typedef struct {
2638            int i;
2639            long j;
2640            double k;
2641            union {
2642                int dummy[256];
2643                struct {
2644                    char q_skiptable[256];
2645                    const char *p;
2646                    int l;
2647                } p;
2648            };
2649        } AnonTypedef;
2650        $DECL_SPEC int funcAnonTypedef(AnonTypedef param);";
2651    $SOURCE2 .= "
2652        int funcAnonTypedef(AnonTypedef param) { return 0; }";
2653
2654    # Added_Field (safe: opaque)
2655    $HEADER1 .= "
2656        struct $DECL_SPEC OpaqueType
2657        {
2658        public:
2659            OpaqueType method(OpaqueType param);
2660            int i;
2661            long j;
2662            double k;
2663            OpaqueType* p;
2664        };";
2665    $SOURCE1 .= "
2666        OpaqueType OpaqueType::method(OpaqueType param) { return param; }";
2667
2668    $HEADER2 .= "
2669        struct $DECL_SPEC OpaqueType
2670        {
2671        public:
2672            OpaqueType method(OpaqueType param);
2673            int i;
2674            long j;
2675            double k;
2676            OpaqueType* p;
2677            int added_member;
2678        };";
2679    $SOURCE2 .= "
2680        OpaqueType OpaqueType::method(OpaqueType param) { return param; }";
2681
2682    # Added_Field (safe: internal)
2683    $HEADER1 .= "
2684        struct $DECL_SPEC InternalType {
2685            InternalType method(InternalType param);
2686            int i;
2687            long j;
2688            double k;
2689            InternalType* p;
2690        };";
2691    $SOURCE1 .= "
2692        InternalType InternalType::method(InternalType param) { return param; }";
2693
2694    $HEADER2 .= "
2695        struct $DECL_SPEC InternalType {
2696            InternalType method(InternalType param);
2697            int i;
2698            long j;
2699            double k;
2700            InternalType* p;
2701            int added_member;
2702        };";
2703    $SOURCE2 .= "
2704        InternalType InternalType::method(InternalType param) { return param; }";
2705
2706    # Size (unnamed struct/union fields within structs/unions)
2707    $HEADER1 .= "
2708        typedef struct {
2709            int a;
2710            struct {
2711                int u1;
2712                float u2;
2713            };
2714            int d;
2715        } UnnamedTypeSize;
2716        $DECL_SPEC int unnamedTypeSize(UnnamedTypeSize param);";
2717    $SOURCE1 .= "
2718        int unnamedTypeSize(UnnamedTypeSize param) { return 0; }";
2719
2720    $HEADER2 .= "
2721        typedef struct {
2722            int a;
2723            struct {
2724                long double u1;
2725                float u2;
2726            };
2727            int d;
2728        } UnnamedTypeSize;
2729        $DECL_SPEC int unnamedTypeSize(UnnamedTypeSize param);";
2730    $SOURCE2 .= "
2731        int unnamedTypeSize(UnnamedTypeSize param) { return 0; }";
2732
2733    # Changed_Constant
2734    $HEADER1 .= "
2735        #define PUBLIC_CONSTANT \"old_value\"";
2736    $HEADER2 .= "
2737        #define PUBLIC_CONSTANT \"new_value\"";
2738
2739    $HEADER1 .= "
2740        #define PUBLIC_VERSION \"1.2 (3.4)\"";
2741    $HEADER2 .= "
2742        #define PUBLIC_VERSION \"1.2 (3.5)\"";
2743
2744    $HEADER1 .= "
2745        #define PRIVATE_CONSTANT \"old_value\"
2746        #undef PRIVATE_CONSTANT";
2747    $HEADER2 .= "
2748        #define PRIVATE_CONSTANT \"new_value\"
2749        #undef PRIVATE_CONSTANT";
2750
2751    # Added_Field (union)
2752    $HEADER1 .= "
2753        union UnionAddedField {
2754            int a;
2755            struct {
2756                int b;
2757                float c;
2758            };
2759            int d;
2760        };
2761        $DECL_SPEC int unionAddedField(UnionAddedField param);";
2762    $SOURCE1 .= "
2763        int unionAddedField(UnionAddedField param) { return 0; }";
2764
2765    $HEADER2 .= "
2766        union UnionAddedField {
2767            int a;
2768            struct {
2769                long double x, y;
2770            } new_field;
2771            struct {
2772                int b;
2773                float c;
2774            };
2775            int d;
2776        };
2777        $DECL_SPEC int unionAddedField(UnionAddedField param);";
2778    $SOURCE2 .= "
2779        int unionAddedField(UnionAddedField param) { return 0; }";
2780
2781    # Removed_Field (union)
2782    $HEADER1 .= "
2783        union UnionRemovedField {
2784            int a;
2785            struct {
2786                long double x, y;
2787            } removed_field;
2788            struct {
2789                int b;
2790                float c;
2791            };
2792            int d;
2793        };
2794        $DECL_SPEC int unionRemovedField(UnionRemovedField param);";
2795    $SOURCE1 .= "
2796        int unionRemovedField(UnionRemovedField param) { return 0; }";
2797
2798    $HEADER2 .= "
2799        union UnionRemovedField {
2800            int a;
2801            struct {
2802                int b;
2803                float c;
2804            };
2805            int d;
2806        };
2807        $DECL_SPEC int unionRemovedField(UnionRemovedField param);";
2808    $SOURCE2 .= "
2809        int unionRemovedField(UnionRemovedField param) { return 0; }";
2810
2811    # Added (typedef change)
2812    $HEADER1 .= "
2813        typedef float TYPEDEF_TYPE;
2814        $DECL_SPEC int parameterTypedefChange(TYPEDEF_TYPE param);";
2815    $SOURCE1 .= "
2816        int parameterTypedefChange(TYPEDEF_TYPE param) { return 1; }";
2817
2818    $HEADER2 .= "
2819        typedef int TYPEDEF_TYPE;
2820        $DECL_SPEC int parameterTypedefChange(TYPEDEF_TYPE param);";
2821    $SOURCE2 .= "
2822        int parameterTypedefChange(TYPEDEF_TYPE param) { return 1; }";
2823
2824    # Parameter_Default_Value_Changed (safe)
2825    # Converted from void* to const char*
2826    $HEADER1 .= "
2827        $DECL_SPEC int paramDefaultValue_Converted(const char* arg = 0); ";
2828    $SOURCE1 .= "
2829        int paramDefaultValue_Converted(const char* arg) { return 0; }";
2830
2831    $HEADER2 .= "
2832        $DECL_SPEC int paramDefaultValue_Converted(const char* arg = (const char*)((void*) 0)); ";
2833    $SOURCE2 .= "
2834        int paramDefaultValue_Converted(const char* arg) { return 0; }";
2835
2836    # Parameter_Default_Value_Changed
2837    # Integer
2838    $HEADER1 .= "
2839        $DECL_SPEC int paramDefaultValueChanged_Integer(int param = 0xf00f); ";
2840    $SOURCE1 .= "
2841        int paramDefaultValueChanged_Integer(int param) { return param; }";
2842
2843    $HEADER2 .= "
2844        $DECL_SPEC int paramDefaultValueChanged_Integer(int param = 0xf00b); ";
2845    $SOURCE2 .= "
2846        int paramDefaultValueChanged_Integer(int param) { return param; }";
2847
2848    # Parameter_Default_Value_Changed
2849    # String
2850    $HEADER1 .= "
2851        $DECL_SPEC int paramDefaultValueChanged_String(char const* param = \" str  1 \"); ";
2852    $SOURCE1 .= "
2853        int paramDefaultValueChanged_String(char const* param) { return 0; }";
2854
2855    $HEADER2 .= "
2856        $DECL_SPEC int paramDefaultValueChanged_String(char const* param = \" str  2 \"); ";
2857    $SOURCE2 .= "
2858        int paramDefaultValueChanged_String(char const* param) { return 0; }";
2859
2860    # Parameter_Default_Value_Changed
2861    # Character
2862    $HEADER1 .= "
2863        $DECL_SPEC int paramDefaultValueChanged_Char(char param = \'A\'); ";
2864    $SOURCE1 .= "
2865        int paramDefaultValueChanged_Char(char param) { return 0; }";
2866
2867    $HEADER2 .= "
2868        $DECL_SPEC int paramDefaultValueChanged_Char(char param = \'B\'); ";
2869    $SOURCE2 .= "
2870        int paramDefaultValueChanged_Char(char param) { return 0; }";
2871
2872    # Parameter_Default_Value_Changed
2873    # Bool
2874    $HEADER1 .= "
2875        $DECL_SPEC int paramDefaultValueChanged_Bool(bool param = true); ";
2876    $SOURCE1 .= "
2877        int paramDefaultValueChanged_Bool(bool param) { return 0; }";
2878
2879    $HEADER2 .= "
2880        $DECL_SPEC int paramDefaultValueChanged_Bool(bool param = false); ";
2881    $SOURCE2 .= "
2882        int paramDefaultValueChanged_Bool(bool param) { return 0; }";
2883
2884    # Parameter_Default_Value_Removed
2885    $HEADER1 .= "
2886        $DECL_SPEC int parameterDefaultValueRemoved(int param = 15);
2887    ";
2888    $SOURCE1 .= "
2889        int parameterDefaultValueRemoved(int param) { return param; }";
2890
2891    $HEADER2 .= "
2892        $DECL_SPEC int parameterDefaultValueRemoved(int param);";
2893    $SOURCE2 .= "
2894        int parameterDefaultValueRemoved(int param) { return param; }";
2895
2896    # Parameter_Default_Value_Added
2897    $HEADER1 .= "
2898        $DECL_SPEC int parameterDefaultValueAdded(int param);
2899    ";
2900    $SOURCE1 .= "
2901        int parameterDefaultValueAdded(int param) { return param; }";
2902
2903    $HEADER2 .= "
2904        $DECL_SPEC int parameterDefaultValueAdded(int param = 15);";
2905    $SOURCE2 .= "
2906        int parameterDefaultValueAdded(int param) { return param; }";
2907
2908    # Field_Type (typedefs in member type)
2909    $HEADER1 .= "
2910        typedef float TYPEDEF_TYPE_2;
2911        struct $DECL_SPEC FieldTypedefChange{
2912        public:
2913            TYPEDEF_TYPE_2 m;
2914            TYPEDEF_TYPE_2 n;
2915        };
2916        $DECL_SPEC int fieldTypedefChange(FieldTypedefChange param);";
2917    $SOURCE1 .= "
2918        int fieldTypedefChange(FieldTypedefChange param) { return 1; }";
2919
2920    $HEADER2 .= "
2921        typedef int TYPEDEF_TYPE_2;
2922        struct $DECL_SPEC FieldTypedefChange{
2923        public:
2924            TYPEDEF_TYPE_2 m;
2925            TYPEDEF_TYPE_2 n;
2926        };
2927        $DECL_SPEC int fieldTypedefChange(FieldTypedefChange param);";
2928    $SOURCE2 .= "
2929        int fieldTypedefChange(FieldTypedefChange param) { return 1; }";
2930
2931    # Callback (testCallback symbol should be affected
2932    # instead of callback1 and callback2)
2933    $HEADER1 .= "
2934        class $DECL_SPEC Callback {
2935        public:
2936            virtual int callback1(int x, int y)=0;
2937            virtual int callback2(int x, int y)=0;
2938        };
2939        $DECL_SPEC int testCallback(Callback* p);";
2940    $SOURCE1 .= "
2941        int testCallback(Callback* p) {
2942            p->callback2(1, 2);
2943            return 0;
2944        }";
2945
2946    $HEADER2 .= "
2947        class $DECL_SPEC Callback {
2948        public:
2949            virtual int callback1(int x, int y)=0;
2950            virtual int added_callback(int x, int y)=0;
2951            virtual int callback2(int x, int y)=0;
2952        };
2953        $DECL_SPEC int testCallback(Callback* p);";
2954    $SOURCE2 .= "
2955        int testCallback(Callback* p) {
2956            p->callback2(1, 2);
2957            return 0;
2958        }";
2959
2960    # End namespace
2961    $HEADER1 .= "\n}\n";
2962    $HEADER2 .= "\n}\n";
2963    $SOURCE1 .= "\n}\n";
2964    $SOURCE2 .= "\n}\n";
2965
2966    runTests("libsample_cpp", "C++", $HEADER1, $SOURCE1, $HEADER2, $SOURCE2, "TestNS::OpaqueType", "_ZN6TestNS12InternalType6methodES0_");
2967}
2968
2969sub testC()
2970{
2971    printMsg("INFO", "\nverifying detectable C library changes");
2972    my ($HEADER1, $SOURCE1, $HEADER2, $SOURCE2) = ();
2973    my $DECL_SPEC = ($OSgroup eq "windows")?"__declspec( dllexport )":"";
2974    my $EXTERN = ($OSgroup eq "windows")?"extern ":""; # add "extern" for CL compiler
2975
2976    # Struct to union
2977    $HEADER1 .= "
2978        typedef struct StructToUnion {
2979            unsigned char A[64];
2980        } StructToUnion;
2981
2982        $DECL_SPEC int structToUnion(StructToUnion *p);";
2983    $SOURCE1 .= "
2984        int structToUnion(StructToUnion *p) { return 0; }";
2985
2986    $HEADER2 .= "
2987        typedef union StructToUnion {
2988            unsigned char A[64];
2989            void *p;
2990        } StructToUnion;
2991
2992        $DECL_SPEC int structToUnion(StructToUnion *p);";
2993    $SOURCE2 .= "
2994        int structToUnion(StructToUnion *p) { return 0; }";
2995
2996    # Typedef to function
2997    $HEADER1 .= "
2998        typedef int(TypedefToFunction)(int pX);
2999
3000        $DECL_SPEC int typedefToFunction(TypedefToFunction* p);";
3001    $SOURCE1 .= "
3002        int typedefToFunction(TypedefToFunction* p) { return 0; }";
3003
3004    $HEADER2 .= "
3005        typedef int(TypedefToFunction)(int pX, int pY);
3006
3007        $DECL_SPEC int typedefToFunction(TypedefToFunction* p);";
3008    $SOURCE2 .= "
3009        int typedefToFunction(TypedefToFunction* p) { return 0; }";
3010
3011    # Used_Reserved
3012    $HEADER1 .= "
3013        typedef struct {
3014            int f;
3015            void* reserved0;
3016            void* reserved1;
3017        } UsedReserved;
3018
3019        $DECL_SPEC int usedReserved(UsedReserved p);";
3020    $SOURCE1 .= "
3021        int usedReserved(UsedReserved p) { return 0; }";
3022
3023    $HEADER2 .= "
3024        typedef struct {
3025            int f;
3026            void* f0;
3027            void* f1;
3028        } UsedReserved;
3029
3030        $DECL_SPEC int usedReserved(UsedReserved p);";
3031    $SOURCE2 .= "
3032        int usedReserved(UsedReserved p) { return 0; }";
3033
3034    # Parameter_Type_And_Register
3035    $HEADER1 .= "
3036        typedef struct {
3037            int a[4];
3038        } ARRAY;
3039        $DECL_SPEC void callConv5 (ARRAY i, int j);";
3040    $SOURCE1 .= "
3041        void callConv5 (ARRAY i, int j) { }";
3042
3043    $HEADER2 .= "
3044        typedef struct {
3045            int a[4];
3046        } ARRAY;
3047        $DECL_SPEC void callConv5 (ARRAY i, double j);";
3048    $SOURCE2 .= "
3049        void callConv5 (ARRAY i, double j) { }";
3050
3051    # Parameter_Type_And_Register
3052    $HEADER1 .= "
3053        typedef union {
3054            int a;
3055            double b;
3056        } UNION;
3057        $DECL_SPEC void callConv4 (UNION i, int j);";
3058    $SOURCE1 .= "
3059        void callConv4 (UNION i, int j) { }";
3060
3061    $HEADER2 .= "
3062        typedef union {
3063            int a;
3064            double b;
3065        } UNION;
3066        $DECL_SPEC void callConv4 (UNION i, double j);";
3067    $SOURCE2 .= "
3068        void callConv4 (UNION i, double j) { }";
3069
3070    # Parameter_Type_And_Register
3071    $HEADER1 .= "
3072        typedef struct {
3073            long a:4;
3074            long b:16;
3075        } POD2;
3076        $DECL_SPEC void callConv3 (POD2 i, int j);";
3077    $SOURCE1 .= "
3078        void callConv3 (POD2 i, int j) { }";
3079
3080    $HEADER2 .= "
3081        typedef struct {
3082            long a:4;
3083            long b:16;
3084        } POD2;
3085        $DECL_SPEC void callConv3 (POD2 i, double j);";
3086    $SOURCE2 .= "
3087        void callConv3 (POD2 i, double j) { }";
3088
3089    # Parameter_Type_And_Register
3090    $HEADER1 .= "
3091        typedef struct {
3092            short s:9;
3093            int j:9;
3094            char c;
3095            short t:9;
3096            short u:9;
3097            char d;
3098        } POD;
3099        $DECL_SPEC void callConv2 (POD i, int j);";
3100    $SOURCE1 .= "
3101        void callConv2 (POD i, int j) { }";
3102
3103    $HEADER2 .= "
3104        typedef struct {
3105            short s:9;
3106            int j:9;
3107            char c;
3108            short t:9;
3109            short u:9;
3110            char d;
3111        } POD;
3112        $DECL_SPEC void callConv2 (POD i, double j);";
3113    $SOURCE2 .= "
3114        void callConv2 (POD i, double j) { }";
3115
3116    # Parameter_Type_And_Register
3117    $HEADER1 .= "
3118        typedef struct {
3119            int a, b;
3120            double d;
3121        } POD1;
3122        $DECL_SPEC void callConv (int e, int f, POD1 s, int g, int h, long double ld, double m, double n, int i, int j, int k);";
3123    $SOURCE1 .= "
3124        void callConv(int e, int f, POD1 s, int g, int h, long double ld, double m, double n, int i, int j, int k) { }";
3125
3126    $HEADER2 .= "
3127        typedef struct {
3128            int a, b;
3129            double d;
3130        } POD1;
3131        $DECL_SPEC void callConv (int e, int f, POD1 s, int g, int h, long double ld, double m, double n, int i, int j, double k);";
3132    $SOURCE2 .= "
3133        void callConv(int e, int f, POD1 s, int g, int h, long double ld, double m, double n, int i, int j, double k) { }";
3134
3135    # Parameter_Type (int to "int const")
3136    $HEADER1 .= "
3137        $DECL_SPEC void parameterBecameConstInt(int arg);";
3138    $SOURCE1 .= "
3139        void parameterBecameConstInt(int arg) { }";
3140
3141    $HEADER2 .= "
3142        $DECL_SPEC void parameterBecameConstInt(const int arg);";
3143    $SOURCE2 .= "
3144        void parameterBecameConstInt(const int arg) { }";
3145
3146    # Parameter_Type ("int const" to int)
3147    $HEADER1 .= "
3148        $DECL_SPEC void parameterBecameNonConstInt(const int arg);";
3149    $SOURCE1 .= "
3150        void parameterBecameNonConstInt(const int arg) { }";
3151
3152    $HEADER2 .= "
3153        $DECL_SPEC void parameterBecameNonConstInt(int arg);";
3154    $SOURCE2 .= "
3155        void parameterBecameNonConstInt(int arg) { }";
3156
3157    # Parameter_Became_Register
3158    $HEADER1 .= "
3159        $DECL_SPEC void parameterBecameRegister(int arg);";
3160    $SOURCE1 .= "
3161        void parameterBecameRegister(int arg) { }";
3162
3163    $HEADER2 .= "
3164        $DECL_SPEC void parameterBecameRegister(register int arg);";
3165    $SOURCE2 .= "
3166        void parameterBecameRegister(register int arg) { }";
3167
3168    # Return_Type_Became_Const
3169    $HEADER1 .= "
3170        $DECL_SPEC char* returnTypeBecameConst(int param);";
3171    $SOURCE1 .= "
3172        char* returnTypeBecameConst(int param) { return (char*)malloc(256); }";
3173
3174    $HEADER2 .= "
3175        $DECL_SPEC const char* returnTypeBecameConst(int param);";
3176    $SOURCE2 .= "
3177        const char* returnTypeBecameConst(int param) { return \"abc\"; }";
3178
3179    # Return_Type_Became_Const (2)
3180    $HEADER1 .= "
3181        $DECL_SPEC char* returnTypeBecameConst2(int param);";
3182    $SOURCE1 .= "
3183        char* returnTypeBecameConst2(int param) { return (char*)malloc(256); }";
3184
3185    $HEADER2 .= "
3186        $DECL_SPEC char*const returnTypeBecameConst2(int param);";
3187    $SOURCE2 .= "
3188        char*const returnTypeBecameConst2(int param) { return (char*const)malloc(256); }";
3189
3190    # Return_Type_Became_Const (3)
3191    $HEADER1 .= "
3192        $DECL_SPEC char* returnTypeBecameConst3(int param);";
3193    $SOURCE1 .= "
3194        char* returnTypeBecameConst3(int param) { return (char*)malloc(256); }";
3195
3196    $HEADER2 .= "
3197        $DECL_SPEC char const*const returnTypeBecameConst3(int param);";
3198    $SOURCE2 .= "
3199        char const*const returnTypeBecameConst3(int param) { return (char const*const)malloc(256); }";
3200
3201    # Return_Type_Became_Volatile
3202    $HEADER1 .= "
3203        $DECL_SPEC char* returnTypeBecameVolatile(int param);";
3204    $SOURCE1 .= "
3205        char* returnTypeBecameVolatile(int param) { return (char*)malloc(256); }";
3206
3207    $HEADER2 .= "
3208        $DECL_SPEC volatile char* returnTypeBecameVolatile(int param);";
3209    $SOURCE2 .= "
3210        volatile char* returnTypeBecameVolatile(int param) { return \"abc\"; }";
3211
3212    # Added_Enum_Member
3213    $HEADER1 .= "
3214        enum AddedEnumMember {
3215            OldMember
3216        };
3217        $DECL_SPEC int addedEnumMember(enum AddedEnumMember param);";
3218    $SOURCE1 .= "
3219        int addedEnumMember(enum AddedEnumMember param) { return 0; }";
3220
3221    $HEADER2 .= "
3222        enum AddedEnumMember {
3223            OldMember,
3224            NewMember
3225        };
3226        $DECL_SPEC int addedEnumMember(enum AddedEnumMember param);";
3227    $SOURCE2 .= "
3228        int addedEnumMember(enum AddedEnumMember param) { return 0; }";
3229
3230    # Parameter_Type (Array)
3231    $HEADER1 .= "
3232        $DECL_SPEC int arrayParameterType(int param[5]);";
3233    $SOURCE1 .= "
3234        int arrayParameterType(int param[5]) { return 0; }";
3235
3236    $HEADER2 .= "
3237        $DECL_SPEC int arrayParameterType(int param[7]);";
3238    $SOURCE2 .= "
3239        int arrayParameterType(int param[7]) { return 0; }";
3240
3241    # Field_Type
3242    $HEADER1 .= "
3243        struct ArrayFieldType
3244        {
3245            int f;
3246            int i[1];
3247        };
3248        $DECL_SPEC int arrayFieldType(struct ArrayFieldType param);";
3249    $SOURCE1 .= "
3250        int arrayFieldType(struct ArrayFieldType param) { return param.i[0]; }";
3251
3252    $HEADER2 .= "
3253        struct ArrayFieldType
3254        {
3255            int f;
3256            int i[];
3257        };
3258        $DECL_SPEC int arrayFieldType(struct ArrayFieldType param);";
3259    $SOURCE2 .= "
3260        int arrayFieldType(struct ArrayFieldType param) { return param.i[0]; }";
3261
3262    # Field_Type_And_Size (Array)
3263    $HEADER1 .= "
3264        struct ArrayFieldSize
3265        {
3266            int i[5];
3267        };
3268        $DECL_SPEC int arrayFieldSize(struct ArrayFieldSize param);";
3269    $SOURCE1 .= "
3270        int arrayFieldSize(struct ArrayFieldSize param) { return 0; }";
3271
3272    $HEADER2 .= "
3273        struct ArrayFieldSize
3274        {
3275            int i[7];
3276        };
3277        $DECL_SPEC int arrayFieldSize(struct ArrayFieldSize param);";
3278    $SOURCE2 .= "
3279        int arrayFieldSize(struct ArrayFieldSize param) { return 0; }";
3280
3281    # Parameter_Became_Non_VaList
3282    $HEADER1 .= "
3283        $DECL_SPEC int parameterNonVaList(int param, ...);";
3284    $SOURCE1 .= "
3285        int parameterNonVaList(int param, ...) { return param; }";
3286
3287    $HEADER2 .= "
3288        $DECL_SPEC int parameterNonVaList(int param1, int param2);";
3289    $SOURCE2 .= "
3290        int parameterNonVaList(int param1, int param2) { return param1; }";
3291
3292    # Parameter_Became_VaList
3293    $HEADER1 .= "
3294        $DECL_SPEC int parameterVaList(int param1, int param2);";
3295    $SOURCE1 .= "
3296        int parameterVaList(int param1, int param2) { return param1; }";
3297
3298    $HEADER2 .= "
3299        $DECL_SPEC int parameterVaList(int param, ...);";
3300    $SOURCE2 .= "
3301        int parameterVaList(int param, ...) { return param; }";
3302
3303    # Field_Type_And_Size
3304    $HEADER1 .= "
3305        struct FieldSizePadded
3306        {
3307            int i;
3308            char changed_field;
3309            // padding (3 bytes)
3310            int j;
3311        };
3312        $DECL_SPEC int fieldSizePadded(struct FieldSizePadded param);";
3313    $SOURCE1 .= "
3314        int fieldSizePadded(struct FieldSizePadded param) { return 0; }";
3315
3316    $HEADER2 .= "
3317        struct FieldSizePadded
3318        {
3319            int i;
3320            int changed_field;
3321            int j;
3322        };
3323        $DECL_SPEC int fieldSizePadded(struct FieldSizePadded param);";
3324    $SOURCE2 .= "
3325        int fieldSizePadded(struct FieldSizePadded param) { return 0; }";
3326
3327    # Parameter_Type_Format
3328    $HEADER1 .= "
3329        struct DType1
3330        {
3331            int i;
3332            double j[7];
3333        };
3334        $DECL_SPEC int parameterTypeFormat(struct DType1 param);";
3335    $SOURCE1 .= "
3336        int parameterTypeFormat(struct DType1 param) { return 0; }";
3337
3338    $HEADER2 .= "
3339        struct DType2
3340        {
3341            double i[7];
3342            int j;
3343        };
3344        $DECL_SPEC int parameterTypeFormat(struct DType2 param);";
3345    $SOURCE2 .= "
3346        int parameterTypeFormat(struct DType2 param) { return 0; }";
3347
3348    # Field_Type_Format
3349    $HEADER1 .= "
3350        struct FieldTypeFormat
3351        {
3352            int i;
3353            struct DType1 j;
3354        };
3355        $DECL_SPEC int fieldTypeFormat(struct FieldTypeFormat param);";
3356    $SOURCE1 .= "
3357        int fieldTypeFormat(struct FieldTypeFormat param) { return 0; }";
3358
3359    $HEADER2 .= "
3360        struct FieldTypeFormat
3361        {
3362            int i;
3363            struct DType2 j;
3364        };
3365        $DECL_SPEC int fieldTypeFormat(struct FieldTypeFormat param);";
3366    $SOURCE2 .= "
3367        int fieldTypeFormat(struct FieldTypeFormat param) { return 0; }";
3368
3369    # Parameter_Type_Format (struct to union)
3370    $HEADER1 .= "
3371        struct DType
3372        {
3373            int i;
3374            double j;
3375        };
3376        $DECL_SPEC int parameterTypeFormat2(struct DType param);";
3377    $SOURCE1 .= "
3378        int parameterTypeFormat2(struct DType param) { return 0; }";
3379
3380    $HEADER2 .= "
3381        union DType
3382        {
3383            int i;
3384            long double j;
3385        };
3386        $DECL_SPEC int parameterTypeFormat2(union DType param);";
3387    $SOURCE2 .= "
3388        int parameterTypeFormat2(union DType param) { return 0; }";
3389
3390    # Global_Data_Size
3391    $HEADER1 .= "
3392        struct GlobalDataSize {
3393            int a;
3394        };
3395        $EXTERN $DECL_SPEC struct GlobalDataSize globalDataSize;";
3396
3397    $HEADER2 .= "
3398        struct GlobalDataSize {
3399            int a, b;
3400        };
3401        $EXTERN $DECL_SPEC struct GlobalDataSize globalDataSize;";
3402
3403    # Global_Data_Type
3404    $HEADER1 .= "
3405        $EXTERN $DECL_SPEC int globalDataType;";
3406
3407    $HEADER2 .= "
3408        $EXTERN $DECL_SPEC float globalDataType;";
3409
3410    # Global_Data_Type_And_Size
3411    $HEADER1 .= "
3412        $EXTERN $DECL_SPEC int globalDataTypeAndSize;";
3413
3414    $HEADER2 .= "
3415        $EXTERN $DECL_SPEC short globalDataTypeAndSize;";
3416
3417    # Global_Data_Value_Changed
3418    # Integer
3419    $HEADER1 .= "
3420        $EXTERN $DECL_SPEC const int globalDataValue_Integer = 10;";
3421
3422    $HEADER2 .= "
3423        $EXTERN $DECL_SPEC const int globalDataValue_Integer = 15;";
3424
3425    # Global_Data_Value_Changed
3426    # Character
3427    $HEADER1 .= "
3428        $EXTERN $DECL_SPEC const char globalDataValue_Char = \'o\';";
3429
3430    $HEADER2 .= "
3431        $EXTERN $DECL_SPEC const char globalDataValue_Char = \'N\';";
3432
3433    # Global_Data_Became_Non_Const
3434    $HEADER1 .= "
3435        $EXTERN $DECL_SPEC const int globalDataBecameNonConst = 10;";
3436
3437    $HEADER2 .= "
3438        extern $DECL_SPEC int globalDataBecameNonConst;";
3439    $SOURCE2 .= "
3440        int globalDataBecameNonConst = 15;";
3441
3442    # Global_Data_Became_Non_Const
3443    # Typedef
3444    $HEADER1 .= "
3445        typedef const int CONST_INT;
3446        $EXTERN $DECL_SPEC CONST_INT globalDataBecameNonConst_Typedef = 10;";
3447
3448    $HEADER2 .= "
3449        extern $DECL_SPEC int globalDataBecameNonConst_Typedef;";
3450    $SOURCE2 .= "
3451        int globalDataBecameNonConst_Typedef = 15;";
3452
3453    # Global_Data_Became_Const
3454    $HEADER1 .= "
3455        extern $DECL_SPEC int globalDataBecameConst;";
3456    $SOURCE1 .= "
3457        int globalDataBecameConst = 10;";
3458
3459    $HEADER2 .= "
3460        $EXTERN $DECL_SPEC const int globalDataBecameConst = 15;";
3461
3462    # Global_Data_Became_Non_Const
3463    $HEADER1 .= "
3464        struct GlobalDataType{int a;int b;struct GlobalDataType* p;};
3465        $EXTERN $DECL_SPEC const struct GlobalDataType globalStructDataBecameNonConst = { 1, 2, (struct GlobalDataType*)0 };";
3466
3467    $HEADER2 .= "
3468        struct GlobalDataType{int a;int b;struct GlobalDataType* p;};
3469        $EXTERN $DECL_SPEC struct GlobalDataType globalStructDataBecameNonConst = { 1, 2, (struct GlobalDataType*)0 };";
3470
3471    # Removed_Parameter
3472    $HEADER1 .= "
3473        $DECL_SPEC int removedParameter(int param, int removed_param);";
3474    $SOURCE1 .= "
3475        int removedParameter(int param, int removed_param) { return 0; }";
3476
3477    $HEADER2 .= "
3478        $DECL_SPEC int removedParameter(int param);";
3479    $SOURCE2 .= "
3480        int removedParameter(int param) { return 0; }";
3481
3482    # Added_Parameter
3483    $HEADER1 .= "
3484        $DECL_SPEC int addedParameter(int param);";
3485    $SOURCE1 .= "
3486        int addedParameter(int param) { return param; }";
3487
3488    $HEADER2 .= "
3489        $DECL_SPEC int addedParameter(int param, int added_param, int added_param2);";
3490    $SOURCE2 .= "
3491        int addedParameter(int param, int added_param, int added_param2) { return added_param2; }";
3492
3493    # Added_Interface (typedef to funcptr parameter)
3494    $HEADER2 .= "
3495        typedef int (*FUNCPTR_TYPE)(int a, int b);
3496        $DECL_SPEC int addedFunc(FUNCPTR_TYPE*const** f);";
3497    $SOURCE2 .= "
3498        int addedFunc(FUNCPTR_TYPE*const** f) { return 0; }";
3499
3500    # Added_Interface (funcptr parameter)
3501    $HEADER2 .= "
3502        $DECL_SPEC int addedFunc2(int(*func)(int, int));";
3503    $SOURCE2 .= "
3504        int addedFunc2(int(*func)(int, int)) { return 0; }";
3505
3506    # Added_Interface (no limited parameters)
3507    $HEADER2 .= "
3508        $DECL_SPEC int addedFunc3(float p1, ...);";
3509    $SOURCE2 .= "
3510        int addedFunc3(float p1, ...) { return 0; }";
3511
3512    # Size
3513    $HEADER1 .= "
3514        struct TypeSize
3515        {
3516            long long i[5];
3517            long j;
3518            double k;
3519            struct TypeSize* p;
3520        };
3521        $DECL_SPEC int testSize(struct TypeSize param, int param_2);";
3522    $SOURCE1 .= "
3523        int testSize(struct TypeSize param, int param_2) { return param_2; }";
3524
3525    $HEADER2 .= "
3526        struct TypeSize
3527        {
3528            long long i[15];
3529            long long j;
3530            double k;
3531            struct TypeSize* p;
3532        };
3533        $DECL_SPEC int testSize(struct TypeSize param, int param_2);";
3534    $SOURCE2 .= "
3535        int testSize(struct TypeSize param, int param_2) { return param_2; }";
3536
3537    # Added_Field_And_Size
3538    $HEADER1 .= "
3539        struct AddedFieldAndSize
3540        {
3541            int i;
3542            long j;
3543            double k;
3544            struct AddedFieldAndSize* p;
3545        };
3546        $DECL_SPEC int addedFieldAndSize(struct AddedFieldAndSize param, int param_2);";
3547    $SOURCE1 .= "
3548        int addedFieldAndSize(struct AddedFieldAndSize param, int param_2) { return param_2; }";
3549
3550    $HEADER2 .= "
3551        struct AddedFieldAndSize
3552        {
3553            int i;
3554            long j;
3555            double k;
3556            struct AddedFieldAndSize* p;
3557            int added_member1;
3558            int added_member2;
3559        };
3560        $DECL_SPEC int addedFieldAndSize(struct AddedFieldAndSize param, int param_2);";
3561    $SOURCE2 .= "
3562        int addedFieldAndSize(struct AddedFieldAndSize param, int param_2) { return param_2; }";
3563
3564    # Added_Middle_Field_And_Size
3565    $HEADER1 .= "
3566        struct AddedMiddleFieldAndSize
3567        {
3568            int i;
3569            long j;
3570            double k;
3571            struct AddedMiddleFieldAndSize* p;
3572        };
3573        $DECL_SPEC int addedMiddleFieldAndSize(struct AddedMiddleFieldAndSize param, int param_2);";
3574    $SOURCE1 .= "
3575        int addedMiddleFieldAndSize(struct AddedMiddleFieldAndSize param, int param_2) { return param_2; }";
3576
3577    $HEADER2 .= "
3578        struct AddedMiddleFieldAndSize
3579        {
3580            int i;
3581            int added_middle_member;
3582            long j;
3583            double k;
3584            struct AddedMiddleFieldAndSize* p;
3585        };
3586        $DECL_SPEC int addedMiddleFieldAndSize(struct AddedMiddleFieldAndSize param, int param_2);";
3587    $SOURCE2 .= "
3588        int addedMiddleFieldAndSize(struct AddedMiddleFieldAndSize param, int param_2) { return param_2; }";
3589
3590    # Added_Middle_Field
3591    $HEADER1 .= "
3592        struct AddedMiddleField
3593        {
3594            unsigned char field1;
3595            unsigned short field2;
3596        };
3597        $DECL_SPEC int addedMiddleField(struct AddedMiddleField param, int param_2);";
3598    $SOURCE1 .= "
3599        int addedMiddleField(struct AddedMiddleField param, int param_2) { return param_2; }";
3600
3601    $HEADER2 .= "
3602        struct AddedMiddleField
3603        {
3604            unsigned char field1;
3605            unsigned char added_field;
3606            unsigned short field2;
3607        };
3608        $DECL_SPEC int addedMiddleField(struct AddedMiddleField param, int param_2);";
3609    $SOURCE2 .= "
3610        int addedMiddleField(struct AddedMiddleField param, int param_2) { return param_2; }";
3611
3612    # Renamed_Field
3613    $HEADER1 .= "
3614        struct RenamedField
3615        {
3616            long i;
3617            long j;
3618            double k;
3619            struct RenamedField* p;
3620        };
3621        $DECL_SPEC int renamedField(struct RenamedField param, int param_2);";
3622    $SOURCE1 .= "
3623        int renamedField(struct RenamedField param, int param_2) { return param_2; }";
3624
3625    $HEADER2 .= "
3626        struct RenamedField
3627        {
3628            long renamed_member;
3629            long j;
3630            double k;
3631            struct RenamedField* p;
3632        };
3633        $DECL_SPEC int renamedField(struct RenamedField param, int param_2);";
3634    $SOURCE2 .= "
3635        int renamedField(struct RenamedField param, int param_2) { return param_2; }";
3636
3637    # Renamed_Field
3638    $HEADER1 .= "
3639        union RenamedUnionField
3640        {
3641            int renamed_from;
3642            double j;
3643        };
3644        $DECL_SPEC int renamedUnionField(union RenamedUnionField param);";
3645    $SOURCE1 .= "
3646        int renamedUnionField(union RenamedUnionField param) { return 0; }";
3647
3648    $HEADER2 .= "
3649        union RenamedUnionField
3650        {
3651            int renamed_to;
3652            double j;
3653        };
3654        $DECL_SPEC int renamedUnionField(union RenamedUnionField param);";
3655    $SOURCE2 .= "
3656        int renamedUnionField(union RenamedUnionField param) { return 0; }";
3657
3658    # Removed_Field_And_Size
3659    $HEADER1 .= "
3660        struct RemovedFieldAndSize
3661        {
3662            int i;
3663            long j;
3664            double k;
3665            struct RemovedFieldAndSize* p;
3666            int removed_member1;
3667            int removed_member2;
3668        };
3669        $DECL_SPEC int removedFieldAndSize(struct RemovedFieldAndSize param, int param_2);";
3670    $SOURCE1 .= "
3671        int removedFieldAndSize(struct RemovedFieldAndSize param, int param_2) { return param_2; }";
3672
3673    $HEADER2 .= "
3674        struct RemovedFieldAndSize
3675        {
3676            int i;
3677            long j;
3678            double k;
3679            struct RemovedFieldAndSize* p;
3680        };
3681        $DECL_SPEC int removedFieldAndSize(struct RemovedFieldAndSize param, int param_2);";
3682    $SOURCE2 .= "
3683        int removedFieldAndSize(struct RemovedFieldAndSize param, int param_2) { return param_2; }";
3684
3685    # Removed_Middle_Field
3686    $HEADER1 .= "
3687        struct RemovedMiddleField
3688        {
3689            int i;
3690            int removed_middle_member;
3691            long j;
3692            double k;
3693            struct RemovedMiddleField* p;
3694        };
3695        $DECL_SPEC int removedMiddleField(struct RemovedMiddleField param, int param_2);";
3696    $SOURCE1 .= "
3697        int removedMiddleField(struct RemovedMiddleField param, int param_2) { return param_2; }";
3698
3699    $HEADER2 .= "
3700        struct RemovedMiddleField
3701        {
3702            int i;
3703            long j;
3704            double k;
3705            struct RemovedMiddleField* p;
3706        };
3707        $DECL_SPEC int removedMiddleField(struct RemovedMiddleField param, int param_2);";
3708    $SOURCE2 .= "
3709        int removedMiddleField(struct RemovedMiddleField param, int param_2) { return param_2; }";
3710
3711    # Enum_Member_Value
3712    $HEADER1 .= "
3713        enum EnumMemberValue
3714        {
3715            MEMBER1=1,
3716            MEMBER2=2
3717        };
3718        $DECL_SPEC int enumMemberValue(enum EnumMemberValue param);";
3719    $SOURCE1 .= "
3720        int enumMemberValue(enum EnumMemberValue param) { return 0; }";
3721
3722    $HEADER2 .= "
3723        enum EnumMemberValue
3724        {
3725            MEMBER1=2,
3726            MEMBER2=1
3727        };
3728        $DECL_SPEC int enumMemberValue(enum EnumMemberValue param);";
3729    $SOURCE2 .= "
3730        int enumMemberValue(enum EnumMemberValue param) { return 0; }";
3731
3732    # Enum_Member_Removed
3733    $HEADER1 .= "
3734        enum EnumMemberRemoved
3735        {
3736            MEMBER=1,
3737            MEMBER_REMOVED=2
3738        };
3739        $DECL_SPEC int enumMemberRemoved(enum EnumMemberRemoved param);";
3740    $SOURCE1 .= "
3741        int enumMemberRemoved(enum EnumMemberRemoved param) { return 0; }";
3742
3743    $HEADER2 .= "
3744        enum EnumMemberRemoved
3745        {
3746            MEMBER=1
3747        };
3748        $DECL_SPEC int enumMemberRemoved(enum EnumMemberRemoved param);";
3749    $SOURCE2 .= "
3750        int enumMemberRemoved(enum EnumMemberRemoved param) { return 0; }";
3751
3752    # Enum_Member_Removed (middle)
3753    $HEADER1 .= "
3754        enum EnumMiddleMemberRemoved
3755        {
3756            MEM_REMOVED,
3757            MEM1,
3758            MEM2
3759        };
3760        $DECL_SPEC int enumMiddleMemberRemoved(enum EnumMiddleMemberRemoved param);";
3761    $SOURCE1 .= "
3762        int enumMiddleMemberRemoved(enum EnumMiddleMemberRemoved param) { return 0; }";
3763
3764    $HEADER2 .= "
3765        enum EnumMiddleMemberRemoved
3766        {
3767            MEM1,
3768            MEM2
3769        };
3770        $DECL_SPEC int enumMiddleMemberRemoved(enum EnumMiddleMemberRemoved param);";
3771    $SOURCE2 .= "
3772        int enumMiddleMemberRemoved(enum EnumMiddleMemberRemoved param) { return 0; }";
3773
3774    # Enum_Member_Name
3775    $HEADER1 .= "
3776        enum EnumMemberName
3777        {
3778            BRANCH1=1,
3779            BRANCH2=2
3780        };
3781        $DECL_SPEC int enumMemberName(enum EnumMemberName param);";
3782    $SOURCE1 .= "
3783        int enumMemberName(enum EnumMemberName param) { return 0; }";
3784
3785    $HEADER2 .= "
3786        enum EnumMemberName
3787        {
3788            BRANCH_FIRST=1,
3789            BRANCH_SECOND=2
3790        };
3791        $DECL_SPEC int enumMemberName(enum EnumMemberName param);";
3792    $SOURCE2 .= "
3793        int enumMemberName(enum EnumMemberName param) { return 0; }";
3794
3795    # Field_Type_And_Size
3796    $HEADER1 .= "
3797        struct FieldTypeAndSize
3798        {
3799            int i;
3800            long j;
3801            double k;
3802            struct FieldTypeAndSize* p;
3803        };
3804        $DECL_SPEC int fieldTypeAndSize(struct FieldTypeAndSize param, int param_2);";
3805    $SOURCE1 .= "
3806        int fieldTypeAndSize(struct FieldTypeAndSize param, int param_2) { return param_2; }";
3807
3808    $HEADER2 .= "
3809        struct FieldTypeAndSize
3810        {
3811            int i;
3812            long long j;
3813            double k;
3814            struct FieldTypeAndSize* p;
3815        };
3816        $DECL_SPEC int fieldTypeAndSize(struct FieldTypeAndSize param, int param_2);";
3817    $SOURCE2 .= "
3818        int fieldTypeAndSize(struct FieldTypeAndSize param, int param_2) { return param_2; }";
3819
3820    # Field_Type
3821    $HEADER1 .= "
3822        struct FieldType
3823        {
3824            int i;
3825            long j;
3826            double k;
3827            struct FieldType* p;
3828        };
3829        $DECL_SPEC int fieldType(struct FieldType param, int param_2);";
3830    $SOURCE1 .= "
3831        int fieldType(struct FieldType param, int param_2) { return param_2; }";
3832
3833    $HEADER2 .= "
3834        struct FieldType
3835        {
3836            float i;
3837            long j;
3838            double k;
3839            struct FieldType* p;
3840        };
3841        $DECL_SPEC int fieldType(struct FieldType param, int param_2);";
3842    $SOURCE2 .= "
3843        int fieldType(struct FieldType param, int param_2) { return param_2; }";
3844
3845    # Field_BaseType
3846    $HEADER1 .= "
3847        struct FieldBaseType
3848        {
3849            int i;
3850            long *j;
3851            double k;
3852            struct FieldBaseType* p;
3853        };
3854        $DECL_SPEC int fieldBaseType(struct FieldBaseType param, int param_2);";
3855    $SOURCE1 .= "
3856        int fieldBaseType(struct FieldBaseType param, int param_2) { return param_2; }";
3857
3858    $HEADER2 .= "
3859        struct FieldBaseType
3860        {
3861            int i;
3862            long long *j;
3863            double k;
3864            struct FieldBaseType* p;
3865        };
3866        $DECL_SPEC int fieldBaseType(struct FieldBaseType param, int param_2);";
3867    $SOURCE2 .= "
3868        int fieldBaseType(struct FieldBaseType param, int param_2) { return param_2; }";
3869
3870    # Field_PointerLevel (and Size)
3871    $HEADER1 .= "
3872        struct FieldPointerLevelAndSize
3873        {
3874            int i;
3875            long long j;
3876            double k;
3877            struct FieldPointerLevelAndSize* p;
3878        };
3879        $DECL_SPEC int fieldPointerLevelAndSize(struct FieldPointerLevelAndSize param, int param_2);";
3880    $SOURCE1 .= "
3881        int fieldPointerLevelAndSize(struct FieldPointerLevelAndSize param, int param_2) { return param_2; }";
3882
3883    $HEADER2 .= "
3884        struct FieldPointerLevelAndSize
3885        {
3886            int i;
3887            long long *j;
3888            double k;
3889            struct FieldPointerLevelAndSize* p;
3890        };
3891        $DECL_SPEC int fieldPointerLevelAndSize(struct FieldPointerLevelAndSize param, int param_2);";
3892    $SOURCE2 .= "
3893        int fieldPointerLevelAndSize(struct FieldPointerLevelAndSize param, int param_2) { return param_2; }";
3894
3895    # Field_PointerLevel
3896    $HEADER1 .= "
3897        struct FieldPointerLevel
3898        {
3899            int i;
3900            long *j;
3901            double k;
3902            struct FieldPointerLevel* p;
3903        };
3904        $DECL_SPEC int fieldPointerLevel(struct FieldPointerLevel param, int param_2);";
3905    $SOURCE1 .= "
3906        int fieldPointerLevel(struct FieldPointerLevel param, int param_2) { return param_2; }";
3907
3908    $HEADER2 .= "
3909        struct FieldPointerLevel
3910        {
3911            int i;
3912            long **j;
3913            double k;
3914            struct FieldPointerLevel* p;
3915        };
3916        $DECL_SPEC int fieldPointerLevel(struct FieldPointerLevel param, int param_2);";
3917    $SOURCE2 .= "
3918        int fieldPointerLevel(struct FieldPointerLevel param, int param_2) { return param_2; }";
3919
3920    # Added_Interface
3921    $HEADER2 .= "
3922        $DECL_SPEC int addedFunc4(int param);";
3923    $SOURCE2 .= "
3924        int addedFunc4(int param) { return param; }";
3925
3926    # Removed_Interface
3927    $HEADER1 .= "
3928        $DECL_SPEC int removedFunc(int param);";
3929    $SOURCE1 .= "
3930        int removedFunc(int param) { return param; }";
3931
3932    # Parameter_Type_And_Size
3933    $HEADER1 .= "
3934        $DECL_SPEC int parameterTypeAndSize(int param, int other_param);";
3935    $SOURCE1 .= "
3936        int parameterTypeAndSize(int param, int other_param) { return other_param; }";
3937
3938    $HEADER2 .= "
3939        $DECL_SPEC int parameterTypeAndSize(long long param, int other_param);";
3940    $SOURCE2 .= "
3941        int parameterTypeAndSize(long long param, int other_param) { return other_param; }";
3942
3943    # Parameter_Type_And_Size + Parameter_Became_Non_Const
3944    $HEADER1 .= "
3945        $DECL_SPEC int parameterTypeAndSizeBecameNonConst(int* const param, int other_param);";
3946    $SOURCE1 .= "
3947        int parameterTypeAndSizeBecameNonConst(int* const param, int other_param) { return other_param; }";
3948
3949    $HEADER2 .= "
3950        $DECL_SPEC int parameterTypeAndSizeBecameNonConst(long double param, int other_param);";
3951    $SOURCE2 .= "
3952        int parameterTypeAndSizeBecameNonConst(long double param, int other_param) { return other_param; }";
3953
3954    # Parameter_Type_And_Size (test calling conventions)
3955    $HEADER1 .= "
3956        $DECL_SPEC int parameterCallingConvention(int p1, int p2, int p3);";
3957    $SOURCE1 .= "
3958        int parameterCallingConvention(int p1, int p2, int p3) { return 0; }";
3959
3960    $HEADER2 .= "
3961        $DECL_SPEC float parameterCallingConvention(char p1, int p2, int p3);";
3962    $SOURCE2 .= "
3963        float parameterCallingConvention(char p1, int p2, int p3) { return 7.0f; }";
3964
3965    # Parameter_Type
3966    $HEADER1 .= "
3967        $DECL_SPEC int parameterType(int param, int other_param);";
3968    $SOURCE1 .= "
3969        int parameterType(int param, int other_param) { return other_param; }";
3970
3971    $HEADER2 .= "
3972        $DECL_SPEC int parameterType(float param, int other_param);";
3973    $SOURCE2 .= "
3974        int parameterType(float param, int other_param) { return other_param; }";
3975
3976    # Parameter_Became_Non_Const
3977    $HEADER1 .= "
3978        $DECL_SPEC int parameterBecameNonConst(int const* param);";
3979    $SOURCE1 .= "
3980        int parameterBecameNonConst(int const* param) { return *param; }";
3981
3982    $HEADER2 .= "
3983        $DECL_SPEC int parameterBecameNonConst(int* param);";
3984    $SOURCE2 .= "
3985        int parameterBecameNonConst(int* param) {
3986            *param=10;
3987            return *param;
3988        }";
3989
3990    # Parameter_Became_Non_Const + Parameter_Became_Non_Volatile
3991    $HEADER1 .= "
3992        $DECL_SPEC int parameterBecameNonConstNonVolatile(int const volatile* param);";
3993    $SOURCE1 .= "
3994        int parameterBecameNonConstNonVolatile(int const volatile* param) { return *param; }";
3995
3996    $HEADER2 .= "
3997        $DECL_SPEC int parameterBecameNonConstNonVolatile(int* param);";
3998    $SOURCE2 .= "
3999        int parameterBecameNonConstNonVolatile(int* param) {
4000            *param=10;
4001            return *param;
4002        }";
4003
4004    # Parameter_BaseType (Typedef)
4005    $HEADER1 .= "
4006        typedef int* PARAM_TYPEDEF;
4007        $DECL_SPEC int parameterBaseTypedefChange(PARAM_TYPEDEF param);";
4008    $SOURCE1 .= "
4009        int parameterBaseTypedefChange(PARAM_TYPEDEF param) { return 0; }";
4010
4011    $HEADER2 .= "
4012        typedef const int* PARAM_TYPEDEF;
4013        $DECL_SPEC int parameterBaseTypedefChange(PARAM_TYPEDEF param);";
4014    $SOURCE2 .= "
4015        int parameterBaseTypedefChange(PARAM_TYPEDEF param) { return 0; }";
4016
4017    # Parameter_BaseType
4018    $HEADER1 .= "
4019        $DECL_SPEC int parameterBaseTypeChange(int *param);";
4020    $SOURCE1 .= "
4021        int parameterBaseTypeChange(int *param) { return sizeof(*param); }";
4022
4023    $HEADER2 .= "
4024        $DECL_SPEC int parameterBaseTypeChange(long long *param);";
4025    $SOURCE2 .= "
4026        int parameterBaseTypeChange(long long *param) { return sizeof(*param); }";
4027
4028    # Parameter_PointerLevel
4029    $HEADER1 .= "
4030        $DECL_SPEC long long parameterPointerLevelAndSize(long long param);";
4031    $SOURCE1 .= "
4032        long long parameterPointerLevelAndSize(long long param) { return param; }";
4033
4034    $HEADER2 .= "
4035        $DECL_SPEC long long parameterPointerLevelAndSize(long long *param);";
4036    $SOURCE2 .= "
4037        long long parameterPointerLevelAndSize(long long *param) { return param[5]; }";
4038
4039    # Parameter_PointerLevel
4040    $HEADER1 .= "
4041        $DECL_SPEC int parameterPointerLevel(int *param);";
4042    $SOURCE1 .= "
4043        int parameterPointerLevel(int *param) { return param[5]; }";
4044
4045    $HEADER2 .= "
4046        $DECL_SPEC int parameterPointerLevel(int **param);";
4047    $SOURCE2 .= "
4048        int parameterPointerLevel(int **param) { return param[5][5]; }";
4049
4050    # Return_Type_And_Size
4051    $HEADER1 .= "
4052        $DECL_SPEC int returnTypeAndSize(int param);";
4053    $SOURCE1 .= "
4054        int returnTypeAndSize(int param) { return 0; }";
4055
4056    $HEADER2 .= "
4057        $DECL_SPEC long long returnTypeAndSize(int param);";
4058    $SOURCE2 .= "
4059        long long returnTypeAndSize(int param) { return 0; }";
4060
4061    # Return_Type
4062    $HEADER1 .= "
4063        $DECL_SPEC int returnType(int param);";
4064    $SOURCE1 .= "
4065        int returnType(int param) { return 1; }";
4066
4067    $HEADER2 .= "
4068        $DECL_SPEC float returnType(int param);";
4069    $SOURCE2 .= "
4070        float returnType(int param) { return 1; }";
4071
4072    # Return_Type_Became_Void ("int" to "void")
4073    $HEADER1 .= "
4074        $DECL_SPEC int returnTypeChangeToVoid(int param);";
4075    $SOURCE1 .= "
4076        int returnTypeChangeToVoid(int param) { return 0; }";
4077
4078    $HEADER2 .= "
4079        $DECL_SPEC void returnTypeChangeToVoid(int param);";
4080    $SOURCE2 .= "
4081        void returnTypeChangeToVoid(int param) { return; }";
4082
4083    # Return_Type ("struct" to "void*")
4084    $HEADER1 .= "
4085        struct SomeStruct {
4086            int a;
4087            double b, c, d;
4088        };
4089        $DECL_SPEC struct SomeStruct* returnTypeChangeToVoidPtr(int param);";
4090    $SOURCE1 .= "
4091        struct SomeStruct* returnTypeChangeToVoidPtr(int param) { return (struct SomeStruct*)0; }";
4092
4093    $HEADER2 .= "
4094        struct SomeStruct {
4095            int a;
4096            double b, c, d;
4097        };
4098        $DECL_SPEC void* returnTypeChangeToVoidPtr(int param);";
4099    $SOURCE2 .= "
4100        void* returnTypeChangeToVoidPtr(int param) { return (void*)0; }";
4101
4102    # Return_Type (structure change)
4103    $HEADER1 .= "
4104        struct SomeStruct2 {
4105            int a;
4106            int b;
4107        };
4108        $DECL_SPEC struct SomeStruct2 returnType2(int param);";
4109    $SOURCE1 .= "
4110        struct SomeStruct2 returnType2(int param) { struct SomeStruct2 r = {1, 2};return r; }";
4111
4112    $HEADER2 .= "
4113        struct SomeStruct2 {
4114            int a;
4115        };
4116        $DECL_SPEC struct SomeStruct2 returnType2(int param);";
4117    $SOURCE2 .= "
4118        struct SomeStruct2 returnType2(int param) { struct SomeStruct2 r = {1};return r; }";
4119
4120    # Return_Type (structure change)
4121    $HEADER1 .= "
4122        struct SomeStruct3 {
4123            int a;
4124            int b;
4125        };
4126        $DECL_SPEC struct SomeStruct3 returnType3(int param);";
4127    $SOURCE1 .= "
4128        struct SomeStruct3 returnType3(int param) { struct SomeStruct3 r = {1, 2};return r; }";
4129
4130    $HEADER2 .= "
4131        struct SomeStruct3 {
4132            int a;
4133            long double b;
4134        };
4135        $DECL_SPEC struct SomeStruct3 returnType3(int param);";
4136    $SOURCE2 .= "
4137        struct SomeStruct3 returnType3(int param) { struct SomeStruct3 r = {1, 2.0L};return r; }";
4138
4139    # Return_Type_From_Void_And_Stack_Layout ("void" to "struct")
4140    $HEADER1 .= "
4141        $DECL_SPEC void returnTypeChangeFromVoidToStruct(int param);";
4142    $SOURCE1 .= "
4143        void returnTypeChangeFromVoidToStruct(int param) { return; }";
4144
4145    $HEADER2 .= "
4146        $DECL_SPEC struct SomeStruct returnTypeChangeFromVoidToStruct(int param);";
4147    $SOURCE2 .= "
4148        struct SomeStruct returnTypeChangeFromVoidToStruct(int param) {
4149            struct SomeStruct obj = {1,2};
4150            return obj;
4151        }";
4152
4153    # Return_Type_Became_Void_And_Stack_Layout ("struct" to "void")
4154    $HEADER1 .= "
4155        $DECL_SPEC struct SomeStruct returnTypeChangeFromStructToVoid(int param);";
4156    $SOURCE1 .= "
4157        struct SomeStruct returnTypeChangeFromStructToVoid(int param) {
4158            struct SomeStruct obj = {1,2};
4159            return obj;
4160        }";
4161
4162    $HEADER2 .= "
4163        $DECL_SPEC void returnTypeChangeFromStructToVoid(int param);";
4164    $SOURCE2 .= "
4165        void returnTypeChangeFromStructToVoid(int param) { return; }";
4166
4167    # Return_Type_From_Void_And_Stack_Layout (safe, "void" to "long")
4168    $HEADER1 .= "
4169        $DECL_SPEC void returnTypeChangeFromVoidToLong(int param);";
4170    $SOURCE1 .= "
4171        void returnTypeChangeFromVoidToLong(int param) { return; }";
4172
4173    $HEADER2 .= "
4174        $DECL_SPEC long returnTypeChangeFromVoidToLong(int param);";
4175    $SOURCE2 .= "
4176        long returnTypeChangeFromVoidToLong(int param) { return 0; }";
4177
4178    # Return_Type_From_Void_And_Stack_Layout (safe, "void" to "void*")
4179    $HEADER1 .= "
4180        $DECL_SPEC void returnTypeChangeFromVoidToVoidPtr(int param);";
4181    $SOURCE1 .= "
4182        void returnTypeChangeFromVoidToVoidPtr(int param) { return; }";
4183
4184    $HEADER2 .= "
4185        $DECL_SPEC void* returnTypeChangeFromVoidToVoidPtr(int param);";
4186    $SOURCE2 .= "
4187        void* returnTypeChangeFromVoidToVoidPtr(int param) { return 0; }";
4188
4189    # Return_Type_From_Register_To_Stack ("int" to "struct")
4190    $HEADER1 .= "
4191        $DECL_SPEC int returnTypeChangeFromIntToStruct(int param);";
4192    $SOURCE1 .= "
4193        int returnTypeChangeFromIntToStruct(int param) { return param; }";
4194
4195    $HEADER2 .= "
4196        $DECL_SPEC struct SomeStruct returnTypeChangeFromIntToStruct(int param);";
4197    $SOURCE2 .= "
4198        struct SomeStruct returnTypeChangeFromIntToStruct(int param) {
4199            struct SomeStruct obj = {1,2};
4200            return obj;
4201        }";
4202
4203    # Return_Type_From_Stack_To_Register (from struct to int)
4204    $HEADER1 .= "
4205        $DECL_SPEC struct SomeStruct returnTypeChangeFromStructToInt(int param);";
4206    $SOURCE1 .= "
4207        struct SomeStruct returnTypeChangeFromStructToInt(int param) {
4208            struct SomeStruct obj = {1,2};
4209            return obj;
4210        }";
4211
4212    $HEADER2 .= "
4213        $DECL_SPEC int returnTypeChangeFromStructToInt(int param);";
4214    $SOURCE2 .= "
4215        int returnTypeChangeFromStructToInt(int param) { return param; }";
4216
4217     # Return_Type_From_Stack_To_Register (from struct to int, without parameters)
4218    $HEADER1 .= "
4219        $DECL_SPEC struct SomeStruct returnTypeChangeFromStructToIntWithNoParams();";
4220    $SOURCE1 .= "
4221        struct SomeStruct returnTypeChangeFromStructToIntWithNoParams() {
4222            struct SomeStruct obj = {1,2};
4223            return obj;
4224        }";
4225
4226    $HEADER2 .= "
4227        $DECL_SPEC int returnTypeChangeFromStructToIntWithNoParams();";
4228    $SOURCE2 .= "
4229        int returnTypeChangeFromStructToIntWithNoParams() { return 0; }";
4230
4231    # Return_BaseType
4232    $HEADER1 .= "
4233        $DECL_SPEC int *returnBaseTypeChange(int param);";
4234    $SOURCE1 .= "
4235        int *returnBaseTypeChange(int param) { return (int*)0; }";
4236
4237    $HEADER2 .= "
4238        $DECL_SPEC long long *returnBaseTypeChange(int param);";
4239    $SOURCE2 .= "
4240        long long *returnBaseTypeChange(int param) { return (long long*)0; }";
4241
4242    # Return_PointerLevel
4243    $HEADER1 .= "
4244        $DECL_SPEC long long returnPointerLevelAndSize(int param);";
4245    $SOURCE1 .= "
4246        long long returnPointerLevelAndSize(int param) { return 100; }";
4247
4248    $HEADER2 .= "
4249        $DECL_SPEC long long *returnPointerLevelAndSize(int param);";
4250    $SOURCE2 .= "
4251        long long *returnPointerLevelAndSize(int param) { return (long long *)0; }";
4252
4253    # Return_PointerLevel
4254    $HEADER1 .= "
4255        $DECL_SPEC long long *returnPointerLevel(int param);";
4256    $SOURCE1 .= "
4257        long long *returnPointerLevel(int param) { return (long long *)0; }";
4258
4259    $HEADER2 .= "
4260        $DECL_SPEC long long **returnPointerLevel(int param);";
4261    $SOURCE2 .= "
4262        long long **returnPointerLevel(int param) { return (long long **)0; }";
4263
4264    # Size (typedef to anon structure)
4265    $HEADER1 .= "
4266        typedef struct
4267        {
4268            int i;
4269            long j;
4270            double k;
4271        } AnonTypedef;
4272        $DECL_SPEC int anonTypedef(AnonTypedef param);";
4273    $SOURCE1 .= "
4274        int anonTypedef(AnonTypedef param) { return 0; }";
4275
4276    $HEADER2 .= "
4277        typedef struct
4278        {
4279            int i;
4280            long j;
4281            double k;
4282            union {
4283                int dummy[256];
4284                struct {
4285                    char q_skiptable[256];
4286                    const char *p;
4287                    int l;
4288                } p;
4289            };
4290        } AnonTypedef;
4291        $DECL_SPEC int anonTypedef(AnonTypedef param);";
4292    $SOURCE2 .= "
4293        int anonTypedef(AnonTypedef param) { return 0; }";
4294
4295    # Size (safe: opaque)
4296    $HEADER1 .= "
4297        struct OpaqueType
4298        {
4299            long long i[5];
4300            long j;
4301            double k;
4302            struct OpaqueType* p;
4303        };
4304        $DECL_SPEC int opaqueTypeUse(struct OpaqueType param, int param_2);";
4305    $SOURCE1 .= "
4306        int opaqueTypeUse(struct OpaqueType param, int param_2) { return param_2; }";
4307
4308    $HEADER2 .= "
4309        struct OpaqueType
4310        {
4311            long long i[5];
4312            long long j;
4313            double k;
4314            struct OpaqueType* p;
4315        };
4316        $DECL_SPEC int opaqueTypeUse(struct OpaqueType param, int param_2);";
4317    $SOURCE2 .= "
4318        int opaqueTypeUse(struct OpaqueType param, int param_2) { return param_2; }";
4319
4320    # Size (safe: internal)
4321    $HEADER1 .= "
4322        struct InternalType
4323        {
4324            long long i[5];
4325            long j;
4326            double k;
4327            struct InternalType* p;
4328        };
4329        $DECL_SPEC int internalTypeUse(struct InternalType param, int param_2);";
4330    $SOURCE1 .= "
4331        int internalTypeUse(struct InternalType param, int param_2) { return param_2; }";
4332
4333    $HEADER2 .= "
4334        struct InternalType
4335        {
4336            long long i[5];
4337            long long j;
4338            double k;
4339            struct InternalType* p;
4340        };
4341        $DECL_SPEC int internalTypeUse(struct InternalType param, int param_2);";
4342    $SOURCE2 .= "
4343        int internalTypeUse(struct InternalType param, int param_2) { return param_2; }";
4344
4345    if($OSgroup eq "linux")
4346    {
4347        # Changed version
4348        $HEADER1 .= "
4349            $DECL_SPEC int changedVersion(int param);
4350            $DECL_SPEC int changedDefaultVersion(int param);";
4351        $SOURCE1 .= "
4352            int changedVersion(int param) { return 0; }
4353            __asm__(\".symver changedVersion,changedVersion\@VERSION_2.0\");
4354            int changedDefaultVersion(int param) { return 0; }";
4355
4356        $HEADER2 .= "
4357            $DECL_SPEC int changedVersion(int param);
4358            $DECL_SPEC int changedDefaultVersion(long param);";
4359        $SOURCE2 .= "
4360            int changedVersion(int param) { return 0; }
4361            __asm__(\".symver changedVersion,changedVersion\@VERSION_3.0\");
4362            int changedDefaultVersion(long param) { return 0; }";
4363
4364        # Unchanged version
4365        $HEADER1 .= "
4366            $DECL_SPEC int unchangedVersion(int param);
4367            $DECL_SPEC int unchangedDefaultVersion(int param);";
4368        $SOURCE1 .= "
4369            int unchangedVersion(int param) { return 0; }
4370            __asm__(\".symver unchangedVersion,unchangedVersion\@VERSION_1.0\");
4371            int unchangedDefaultVersion(int param) { return 0; }";
4372
4373        $HEADER2 .= "
4374            $DECL_SPEC int unchangedVersion(int param);
4375            $DECL_SPEC int unchangedDefaultVersion(int param);";
4376        $SOURCE2 .= "
4377            int unchangedVersion(int param) { return 0; }
4378            __asm__(\".symver unchangedVersion,unchangedVersion\@VERSION_1.0\");
4379            int unchangedDefaultVersion(int param) { return 0; }";
4380
4381        # Non-Default to Default
4382        $HEADER1 .= "
4383            $DECL_SPEC int changedVersionToDefault(int param);";
4384        $SOURCE1 .= "
4385            int changedVersionToDefault(int param) { return 0; }
4386            __asm__(\".symver changedVersionToDefault,changedVersionToDefault\@VERSION_1.0\");";
4387
4388        $HEADER2 .= "
4389            $DECL_SPEC int changedVersionToDefault(long param);";
4390        $SOURCE2 .= "
4391            int changedVersionToDefault(long param) { return 0; }";
4392
4393        # Default to Non-Default
4394        $HEADER1 .= "
4395            $DECL_SPEC int changedVersionToNonDefault(int param);";
4396        $SOURCE1 .= "
4397            int changedVersionToNonDefault(int param) { return 0; }";
4398
4399        $HEADER2 .= "
4400            $DECL_SPEC int changedVersionToNonDefault(long param);";
4401        $SOURCE2 .= "
4402            int changedVersionToNonDefault(long param) { return 0; }
4403            __asm__(\".symver changedVersionToNonDefault,changedVersionToNonDefault\@VERSION_3.0\");";
4404
4405        # Added version
4406        $HEADER1 .= "
4407            $DECL_SPEC int addedVersion(int param);
4408            $DECL_SPEC int addedDefaultVersion(int param);";
4409        $SOURCE1 .= "
4410            int addedVersion(int param) { return 0; }
4411            int addedDefaultVersion(int param) { return 0; }";
4412
4413        $HEADER2 .= "
4414            $DECL_SPEC int addedVersion(int param);
4415            $DECL_SPEC int addedDefaultVersion(int param);";
4416        $SOURCE2 .= "
4417            int addedVersion(int param) { return 0; }
4418            __asm__(\".symver addedVersion,addedVersion\@VERSION_2.0\");
4419            int addedDefaultVersion(int param) { return 0; }";
4420
4421        # Removed version
4422        $HEADER1 .= "
4423            $DECL_SPEC int removedVersion(int param);
4424            $DECL_SPEC int removedVersion2(int param);
4425            $DECL_SPEC int removedDefaultVersion(int param);";
4426        $SOURCE1 .= "
4427            int removedVersion(int param) { return 0; }
4428            __asm__(\".symver removedVersion,removedVersion\@VERSION_1.0\");
4429            int removedVersion2(int param) { return 0; }
4430            __asm__(\".symver removedVersion2,removedVersion\@VERSION_3.0\");
4431            int removedDefaultVersion(int param) { return 0; }";
4432
4433        $HEADER2 .= "
4434            $DECL_SPEC int removedVersion(int param);
4435            $DECL_SPEC int removedVersion2(int param);
4436            $DECL_SPEC int removedDefaultVersion(int param);";
4437        $SOURCE2 .= "
4438            int removedVersion(int param) { return 0; }
4439            int removedVersion2(int param) { return 0; }
4440            __asm__(\".symver removedVersion2,removedVersion\@VERSION_3.0\");
4441            int removedDefaultVersion(int param) { return 0; }";
4442
4443        # Return_Type (good versioning)
4444        $HEADER1 .= "
4445            $DECL_SPEC int goodVersioning(int param);";
4446        $SOURCE1 .= "
4447            int goodVersioning(int param) { return 0; }
4448            __asm__(\".symver goodVersioning,goodVersioning\@VERSION_1.0\");";
4449
4450        $HEADER2 .= "
4451            $DECL_SPEC int goodVersioningOld(int param);";
4452        $SOURCE2 .= "
4453            int goodVersioningOld(int param) { return 0; }
4454            __asm__(\".symver goodVersioningOld,goodVersioning\@VERSION_1.0\");";
4455
4456        $HEADER2 .= "
4457            $DECL_SPEC float goodVersioning(int param);";
4458        $SOURCE2 .= "
4459            float goodVersioning(int param) { return 0.7; }
4460            __asm__(\".symver goodVersioning,goodVersioning\@VERSION_2.0\");";
4461
4462        # Return_Type (bad versioning)
4463        $HEADER1 .= "
4464            $DECL_SPEC int badVersioning(int param);";
4465        $SOURCE1 .= "
4466            int badVersioning(int param) { return 0; }
4467            __asm__(\".symver badVersioning,badVersioning\@VERSION_1.0\");";
4468
4469        $HEADER2 .= "
4470            $DECL_SPEC float badVersioningOld(int param);";
4471        $SOURCE2 .= "
4472            float badVersioningOld(int param) { return 0.7; }
4473            __asm__(\".symver badVersioningOld,badVersioning\@VERSION_1.0\");";
4474
4475        $HEADER2 .= "
4476            $DECL_SPEC float badVersioning(int param);";
4477        $SOURCE2 .= "
4478            float badVersioning(int param) { return 0.7; }
4479            __asm__(\".symver badVersioning,badVersioning\@VERSION_2.0\");";
4480    }
4481    # unnamed struct/union fields within structs/unions
4482    $HEADER1 .= "
4483        typedef struct
4484        {
4485            int a;
4486            union {
4487                int b;
4488                float c;
4489            };
4490            int d;
4491        } UnnamedTypeSize;
4492        $DECL_SPEC int unnamedTypeSize(UnnamedTypeSize param);";
4493    $SOURCE1 .= "
4494        int unnamedTypeSize(UnnamedTypeSize param) { return 0; }";
4495
4496    $HEADER2 .= "
4497        typedef struct
4498        {
4499            int a;
4500            union {
4501                long double b;
4502                float c;
4503            };
4504            int d;
4505        } UnnamedTypeSize;
4506        $DECL_SPEC int unnamedTypeSize(UnnamedTypeSize param);";
4507    $SOURCE2 .= "
4508        int unnamedTypeSize(UnnamedTypeSize param) { return 0; }";
4509
4510    # Changed_Constant (#define)
4511    $HEADER1 .= "
4512        #define PUBLIC_CONSTANT \"old_value\"";
4513    $HEADER2 .= "
4514        #define PUBLIC_CONSTANT \"new_value\"";
4515
4516    # Changed_Constant (Safe)
4517    $HEADER1 .= "
4518        #define INTEGER_CONSTANT 0x01";
4519    $HEADER2 .= "
4520        #define INTEGER_CONSTANT 1";
4521
4522    # Changed_Constant (Safe)
4523    $HEADER1 .= "
4524        #define PRIVATE_CONSTANT \"old_value\"
4525        #undef PRIVATE_CONSTANT";
4526    $HEADER2 .= "
4527        #define PRIVATE_CONSTANT \"new_value\"
4528        #undef PRIVATE_CONSTANT";
4529
4530    # Changed_Constant (enum)
4531    $HEADER1 .= "
4532        enum {
4533            SOME_CONSTANT=0x1
4534        };";
4535    $HEADER2 .= "
4536        enum {
4537            SOME_CONSTANT=0x2
4538        };";
4539
4540    # Added_Constant (#define)
4541    $HEADER2 .= "
4542        #define ADDED_CNST \"value\"";
4543
4544    # Added_Constant (enum)
4545    $HEADER1 .= "
4546        enum {
4547            CONSTANT1
4548        };";
4549    $HEADER2 .= "
4550        enum {
4551            CONSTANT1,
4552            ADDED_CONSTANT
4553        };";
4554
4555    # Removed_Constant (#define)
4556    $HEADER1 .= "
4557        #define REMOVED_CNST \"value\"";
4558
4559    # Removed_Constant (enum)
4560    $HEADER1 .= "
4561        enum {
4562            CONSTANT2,
4563            REMOVED_CONSTANT
4564        };";
4565    $HEADER2 .= "
4566        enum {
4567            CONSTANT2
4568        };";
4569
4570    # Added_Field (union)
4571    $HEADER1 .= "
4572        union UnionTypeAddedField
4573        {
4574            int a;
4575            struct {
4576                int b;
4577                float c;
4578            };
4579            int d;
4580        };
4581        $DECL_SPEC int unionTypeAddedField(union UnionTypeAddedField param);";
4582    $SOURCE1 .= "
4583        int unionTypeAddedField(union UnionTypeAddedField param) { return 0; }";
4584
4585    $HEADER2 .= "
4586        union UnionTypeAddedField
4587        {
4588            int a;
4589            struct {
4590                long double x, y;
4591            } new_field;
4592            struct {
4593                int b;
4594                float c;
4595            };
4596            int d;
4597        };
4598        $DECL_SPEC int unionTypeAddedField(union UnionTypeAddedField param);";
4599    $SOURCE2 .= "
4600        int unionTypeAddedField(union UnionTypeAddedField param) { return 0; }";
4601
4602    # Prameter_BaseType (typedef)
4603    $HEADER1 .= "
4604        typedef float TYPEDEF_TYPE;
4605        $DECL_SPEC int parameterTypedefChange(TYPEDEF_TYPE param);";
4606    $SOURCE1 .= "
4607        int parameterTypedefChange(TYPEDEF_TYPE param) { return 1.0; }";
4608
4609    $HEADER2 .= "
4610        typedef int TYPEDEF_TYPE;
4611        $DECL_SPEC int parameterTypedefChange(TYPEDEF_TYPE param);";
4612    $SOURCE2 .= "
4613        int parameterTypedefChange(TYPEDEF_TYPE param) { return 1; }";
4614
4615    # Field_BaseType (typedef in member type)
4616    $HEADER1 .= "
4617        typedef float TYPEDEF_TYPE_2;
4618        struct FieldBaseTypedefChange {
4619            TYPEDEF_TYPE_2 m;
4620        };
4621        $DECL_SPEC int fieldBaseTypedefChange(struct FieldBaseTypedefChange param);";
4622    $SOURCE1 .= "
4623        int fieldBaseTypedefChange(struct FieldBaseTypedefChange param) { return 1; }";
4624
4625    $HEADER2 .= "
4626        typedef int TYPEDEF_TYPE_2;
4627        struct FieldBaseTypedefChange {
4628            TYPEDEF_TYPE_2 m;
4629        };
4630        $DECL_SPEC int fieldBaseTypedefChange(struct FieldBaseTypedefChange param);";
4631    $SOURCE2 .= "
4632        int fieldBaseTypedefChange(struct FieldBaseTypedefChange param) { return 1; }";
4633
4634    # C++ keywords in C code
4635    $HEADER1 .= "
4636        $DECL_SPEC int testCppKeywords1(int class, int virtual, int (*new)(int));";
4637    $SOURCE1 .= "
4638        $DECL_SPEC int testCppKeywords1(int class, int virtual, int (*new)(int)) { return 0; }";
4639
4640    $HEADER2 .= "
4641        $DECL_SPEC int testCppKeywords1(int class, int virtual);
4642        $DECL_SPEC int testCppKeywords2(int operator, int other);
4643        $DECL_SPEC int testCppKeywords3(int operator);
4644        $DECL_SPEC int operator(int class, int this);
4645        $DECL_SPEC int delete(int virtual, int* this);
4646        struct CppKeywords {
4647            int bool: 8;
4648            //int*this;
4649        };
4650        #ifdef __cplusplus
4651            class TestCppKeywords {
4652                void operator delete(void*);
4653                void operator ()(int);
4654                void operator,(int);
4655                void delete() {
4656                    delete this;
4657                };
4658            };
4659        #endif";
4660    $SOURCE2 .= "
4661        $DECL_SPEC int testCppKeywords1(int class, int virtual) { return 0; }";
4662
4663    # Regression
4664    $HEADER1 .= "
4665        $DECL_SPEC int* testRegression(int *pointer, char const *name, ...);";
4666    $SOURCE1 .= "
4667        int* testRegression(int *pointer, char const *name, ...) { return 0; }";
4668
4669    $HEADER2 .= "
4670        $DECL_SPEC int* testRegression(int *pointer, char const *name, ...);";
4671    $SOURCE2 .= "
4672        int* testRegression(int *pointer, char const *name, ...) { return 0; }";
4673
4674    runTests("libsample_c", "C", $HEADER1, $SOURCE1, $HEADER2, $SOURCE2, "struct OpaqueType", "internalTypeUse");
4675}
4676
4677sub runTests($$$$$$$$)
4678{
4679    my ($LibName, $Lang, $HEADER1, $SOURCE1, $HEADER2, $SOURCE2, $Opaque, $Private) = @_;
4680
4681    my $SrcE = ($Lang eq "C++")?"cpp":"c";
4682    rmtree($LibName);
4683
4684    my $ObjName = "libsample";
4685
4686    # creating test suite
4687    my $Path_v1 = "$LibName/$ObjName.v1";
4688    my $Path_v2 = "$LibName/$ObjName.v2";
4689    mkpath($Path_v1);
4690    mkpath($Path_v2);
4691    writeFile("$Path_v1/$ObjName.h", $HEADER1."\n");
4692    writeFile("$Path_v1/$ObjName.$SrcE", "#include \"$ObjName.h\"\n".$SOURCE1."\n");
4693    writeFile("$LibName/v1.xml", "
4694        <version>
4695            1.0
4696        </version>
4697
4698        <headers>
4699            ".get_abs_path($Path_v1)."
4700        </headers>
4701
4702        <libs>
4703            ".get_abs_path($Path_v1)."
4704        </libs>
4705
4706        <skip_types>
4707            $Opaque
4708        </skip_types>
4709
4710        <skip_symbols>
4711            $Private
4712        </skip_symbols>
4713
4714        <include_paths>
4715            ".get_abs_path($Path_v1)."
4716        </include_paths>\n");
4717    writeFile("$Path_v1/test.$SrcE", "
4718        #include \"$ObjName.h\"
4719        #include <stdio.h>
4720        ".($Lang eq "C++"?"using namespace TestNS;":"")."
4721        int main()
4722        {
4723            int ret = 0;
4724            printf(\"\%d\\n\", ret);
4725            return 0;
4726        }\n");
4727
4728    writeFile("$Path_v2/$ObjName.h", $HEADER2."\n");
4729    writeFile("$Path_v2/$ObjName.$SrcE", "#include \"$ObjName.h\"\n".$SOURCE2."\n");
4730    writeFile("$LibName/v2.xml", "
4731        <version>
4732            2.0
4733        </version>
4734
4735        <headers>
4736            ".get_abs_path($Path_v2)."
4737        </headers>
4738
4739        <libs>
4740            ".get_abs_path($Path_v2)."
4741        </libs>
4742
4743        <skip_types>
4744            $Opaque
4745        </skip_types>
4746
4747        <skip_symbols>
4748            $Private
4749        </skip_symbols>
4750
4751        <include_paths>
4752            ".get_abs_path($Path_v2)."
4753        </include_paths>\n");
4754    writeFile("$Path_v2/test.$SrcE", "
4755        #include \"$ObjName.h\"
4756        #include <stdio.h>
4757        ".($Lang eq "C++"?"using namespace TestNS;":"")."
4758        int main()
4759        {
4760            int ret = 0;
4761            printf(\"\%d\\n\", ret);
4762            return 0;
4763        }\n");
4764
4765    my ($BuildCmd, $BuildCmd_Test) = ("", "");
4766    if($OSgroup eq "windows")
4767    {
4768        check_win32_env(); # to run MS VC++ compiler
4769        my $CL = get_CmdPath("cl");
4770
4771        if(not $CL) {
4772            exitStatus("Not_Found", "can't find \"cl\" compiler");
4773        }
4774        $BuildCmd = "$CL /LD $ObjName.$SrcE >build_log.txt 2>&1";
4775        $BuildCmd_Test = "$CL test.$SrcE $ObjName.$LIB_EXT";
4776    }
4777    elsif($OSgroup eq "linux")
4778    {
4779        if($Lang eq "C")
4780        { # tests for symbol versioning
4781            writeFile("$Path_v1/version", "
4782                VERSION_1.0 {
4783                    unchangedDefaultVersion;
4784                    removedDefaultVersion;
4785                };
4786                VERSION_2.0 {
4787                    changedDefaultVersion;
4788                };
4789                VERSION_3.0 {
4790                    changedVersionToNonDefault;
4791                };
4792            ");
4793            writeFile("$Path_v2/version", "
4794                VERSION_1.0 {
4795                    unchangedDefaultVersion;
4796                    changedVersionToDefault;
4797                };
4798                VERSION_2.0 {
4799                    addedDefaultVersion;
4800                };
4801                VERSION_3.0 {
4802                    changedDefaultVersion;
4803                };
4804            ");
4805            $BuildCmd = $GCC_PATH." -Wl,--version-script version -shared $ObjName.$SrcE -o $ObjName.$LIB_EXT -g -Og";
4806            $BuildCmd_Test = $GCC_PATH." -Wl,--version-script version test.$SrcE -Wl,$ObjName.$LIB_EXT -o test";
4807        }
4808        else
4809        {
4810            $BuildCmd = $GCC_PATH." -shared -x c++ $ObjName.$SrcE -lstdc++ -o $ObjName.$LIB_EXT -g -Og";
4811            $BuildCmd_Test = $GCC_PATH." -x c++ test.$SrcE -lstdc++ -Wl,$ObjName.$LIB_EXT -o test";
4812        }
4813        if(getArch_GCC(1)=~/\A(arm|x86_64)\Z/i)
4814        { # relocation R_ARM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
4815            $BuildCmd .= " -fPIC";
4816            $BuildCmd_Test .= " -fPIC";
4817        }
4818    }
4819    elsif($OSgroup eq "macos")
4820    { # using GCC -dynamiclib
4821        if($Lang eq "C")
4822        {
4823            $BuildCmd = $GCC_PATH." -dynamiclib $ObjName.$SrcE -o $ObjName.$LIB_EXT";
4824            $BuildCmd_Test = $GCC_PATH." test.$SrcE $ObjName.$LIB_EXT -o test";
4825        }
4826        else
4827        { # C++
4828            $BuildCmd = $GCC_PATH." -dynamiclib -x c++ $ObjName.$SrcE -lstdc++ -o $ObjName.$LIB_EXT";
4829            $BuildCmd_Test = $GCC_PATH." -x c++ test.$SrcE $ObjName.$LIB_EXT -o test";
4830        }
4831    }
4832    else
4833    { # default unix-like
4834      # symbian target
4835        if($Lang eq "C")
4836        {
4837            $BuildCmd = $GCC_PATH." -shared $ObjName.$SrcE -o $ObjName.$LIB_EXT -g -Og";
4838            $BuildCmd_Test = $GCC_PATH." test.$SrcE -Wl,$ObjName.$LIB_EXT -o test";
4839        }
4840        else
4841        { # C++
4842            $BuildCmd = $GCC_PATH." -shared -x c++ $ObjName.$SrcE -lstdc++ -o $ObjName.$LIB_EXT -g -Og";
4843            $BuildCmd_Test = $GCC_PATH." -x c++ test.$SrcE -Wl,$ObjName.$LIB_EXT -o test";
4844        }
4845    }
4846
4847    if(my $Opts = getGCC_Opts(1))
4848    { # user-defined options
4849        $BuildCmd .= " ".$Opts;
4850        $BuildCmd_Test .= " ".$Opts;
4851    }
4852
4853    my $MkContent = "all:\n\t$BuildCmd\ntest:\n\t$BuildCmd_Test\n";
4854    if($OSgroup eq "windows") {
4855        $MkContent .= "clean:\n\tdel test $ObjName.so\n";
4856    }
4857    else {
4858        $MkContent .= "clean:\n\trm test $ObjName.so\n";
4859    }
4860    writeFile("$Path_v1/Makefile", $MkContent);
4861    writeFile("$Path_v2/Makefile", $MkContent);
4862    system("cd $Path_v1 && $BuildCmd >build-log.txt 2>&1");
4863    if($?)
4864    {
4865        my $Msg = "can't compile $LibName v.1: \'$Path_v1/build-log.txt\'";
4866        if(readFile("$Path_v1/build-log.txt")=~/error trying to exec \W+cc1plus\W+/) {
4867            $Msg .= "\nDid you install G++?";
4868        }
4869        exitStatus("Error", $Msg);
4870    }
4871    system("cd $Path_v2 && $BuildCmd >build-log.txt 2>&1");
4872    if($?) {
4873        exitStatus("Error", "can't compile $LibName v.2: \'$Path_v2/build-log.txt\'");
4874    }
4875    # executing the tool
4876    my @Cmd = ("perl", $0, "-l", $LibName);
4877
4878    if($TestABIDumper and $OSgroup eq "linux")
4879    {
4880        my @Cmd_d1 = ("abi-dumper", $Path_v1."/".$ObjName.".".$LIB_EXT, "-o", $LibName."/ABIv1.dump");
4881        @Cmd_d1 = (@Cmd_d1, "-public-headers", $Path_v1, "-lver", "1.0");
4882        if($Debug)
4883        { # debug mode
4884            printMsg("INFO", "executing @Cmd_d1");
4885        }
4886        system(@Cmd_d1);
4887        printMsg("INFO", "");
4888
4889        my @Cmd_d2 = ("abi-dumper", $Path_v2."/".$ObjName.".".$LIB_EXT, "-o", $LibName."/ABIv2.dump");
4890        @Cmd_d2 = (@Cmd_d2, "-public-headers", $Path_v2, "-lver", "2.0");
4891        if($Debug)
4892        { # debug mode
4893            printMsg("INFO", "executing @Cmd_d2");
4894        }
4895        system(@Cmd_d2);
4896        printMsg("INFO", "");
4897
4898        @Cmd = (@Cmd, "-old", $LibName."/ABIv1.dump", "-new", $LibName."/ABIv2.dump");
4899    }
4900    else
4901    {
4902        @Cmd = (@Cmd, "-old", "$LibName/v1.xml", "-new", "$LibName/v2.xml");
4903    }
4904
4905    if($Lang eq "C") {
4906        @Cmd = (@Cmd, "-cxx-incompatible");
4907    }
4908
4909    if($TestDump)
4910    {
4911        @Cmd = (@Cmd, "-use-dumps");
4912        if($SortDump) {
4913            @Cmd = (@Cmd, "-sort");
4914        }
4915    }
4916    if($DumpFormat and $DumpFormat ne "perl")
4917    { # Perl Data::Dumper is default format
4918        @Cmd = (@Cmd, "-dump-format", $DumpFormat);
4919    }
4920    if($GCC_PATH ne "gcc") {
4921        @Cmd = (@Cmd, "-cross-gcc", $GCC_PATH);
4922    }
4923    if($Quiet)
4924    { # quiet mode
4925        @Cmd = (@Cmd, "-quiet");
4926        @Cmd = (@Cmd, "-logging-mode", "a");
4927    }
4928    elsif($LogMode and $LogMode ne "w")
4929    { # "w" is default
4930        @Cmd = (@Cmd, "-logging-mode", $LogMode);
4931    }
4932    if($ExtendedCheck)
4933    { # extended mode
4934        @Cmd = (@Cmd, "-extended");
4935        if($Lang eq "C") {
4936            @Cmd = (@Cmd, "-lang", "C");
4937        }
4938    }
4939    if($ReportFormat and $ReportFormat ne "html")
4940    { # HTML is default format
4941        @Cmd = (@Cmd, "-report-format", $ReportFormat);
4942    }
4943    if($CheckHeadersOnly) {
4944        @Cmd = (@Cmd, "-headers-only");
4945    }
4946    if($OldStyle) {
4947        @Cmd = (@Cmd, "-old-style");
4948    }
4949    if($Debug)
4950    { # debug mode
4951        @Cmd = (@Cmd, "-debug");
4952        printMsg("INFO", "executing @Cmd");
4953    }
4954    system(@Cmd);
4955
4956    my $ECode = $?>>8;
4957
4958    if($ECode!~/\A[0-1]\Z/)
4959    { # error
4960        exitStatus("Error", "analysis has failed");
4961    }
4962
4963    my $RPath = "compat_reports/$LibName/1.0_to_2.0/compat_report.$ReportFormat";
4964    my $NProblems = 0;
4965    if($ReportFormat eq "xml")
4966    {
4967        my $Content = readFile($RPath);
4968        # binary
4969        if(my $PSummary = parseTag(\$Content, "problem_summary"))
4970        {
4971            $NProblems += int(parseTag(\$PSummary, "removed_symbols"));
4972            if(my $TProblems = parseTag(\$PSummary, "problems_with_types"))
4973            {
4974                $NProblems += int(parseTag(\$TProblems, "high"));
4975                $NProblems += int(parseTag(\$TProblems, "medium"));
4976            }
4977            if(my $IProblems = parseTag(\$PSummary, "problems_with_symbols"))
4978            {
4979                $NProblems += int(parseTag(\$IProblems, "high"));
4980                $NProblems += int(parseTag(\$IProblems, "medium"));
4981            }
4982        }
4983        # source
4984        if(my $PSummary = parseTag(\$Content, "problem_summary"))
4985        {
4986            $NProblems += int(parseTag(\$PSummary, "removed_symbols"));
4987            if(my $TProblems = parseTag(\$PSummary, "problems_with_types"))
4988            {
4989                $NProblems += int(parseTag(\$TProblems, "high"));
4990                $NProblems += int(parseTag(\$TProblems, "medium"));
4991            }
4992            if(my $IProblems = parseTag(\$PSummary, "problems_with_symbols"))
4993            {
4994                $NProblems += int(parseTag(\$IProblems, "high"));
4995                $NProblems += int(parseTag(\$IProblems, "medium"));
4996            }
4997        }
4998    }
4999    else
5000    {
5001        my $BReport = readAttributes($RPath, 0);
5002        $NProblems += $BReport->{"removed"};
5003        $NProblems += $BReport->{"type_problems_high"}+$BReport->{"type_problems_medium"};
5004        $NProblems += $BReport->{"interface_problems_high"}+$BReport->{"interface_problems_medium"};
5005        my $SReport = readAttributes($RPath, 1);
5006        $NProblems += $SReport->{"removed"};
5007        $NProblems += $SReport->{"type_problems_high"}+$SReport->{"type_problems_medium"};
5008        $NProblems += $SReport->{"interface_problems_high"}+$SReport->{"interface_problems_medium"};
5009    }
5010    if(($LibName eq "libsample_c" and $NProblems>70)
5011    or ($LibName eq "libsample_cpp" and $NProblems>150)) {
5012        printMsg("INFO", "result: SUCCESS ($NProblems problems found)\n");
5013    }
5014    else {
5015        printMsg("ERROR", "result: FAILED ($NProblems problems found)\n");
5016    }
5017}
5018
5019return 1;