aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/ext
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/ext')
-rw-r--r--gcc/testsuite/g++.dg/ext/altivec-apple-11.C18
-rw-r--r--gcc/testsuite/g++.dg/ext/apple-altivec-1.C43
-rw-r--r--gcc/testsuite/g++.dg/ext/apple-altivec-2.C398
-rw-r--r--gcc/testsuite/g++.dg/ext/apple-altivec-3.C18
-rw-r--r--gcc/testsuite/g++.dg/ext/apple-altivec-4.C15
-rw-r--r--gcc/testsuite/g++.dg/ext/apple-altivec-5.C31
-rw-r--r--gcc/testsuite/g++.dg/ext/apple-altivec-6.C15
-rw-r--r--gcc/testsuite/g++.dg/ext/attrib20.C23
-rw-r--r--gcc/testsuite/g++.dg/ext/attrib21.C17
-rw-r--r--gcc/testsuite/g++.dg/ext/lvalue-cast-1.C34
-rw-r--r--gcc/testsuite/g++.dg/ext/lvalue-cast-2.C14
-rw-r--r--gcc/testsuite/g++.dg/ext/lvalue-cond-1.C32
-rw-r--r--gcc/testsuite/g++.dg/ext/new-delete-1.C28
-rw-r--r--gcc/testsuite/g++.dg/ext/new-delete-2.C28
-rw-r--r--gcc/testsuite/g++.dg/ext/opt-pragma-2.C27
-rw-r--r--gcc/testsuite/g++.dg/ext/opt-pragma-3.C27
-rw-r--r--gcc/testsuite/g++.dg/ext/opt-pragma-4.C26
-rw-r--r--gcc/testsuite/g++.dg/ext/stmtexpr4.C8
-rw-r--r--gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C2
-rw-r--r--gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C2
-rw-r--r--gcc/testsuite/g++.dg/ext/visibility/visibility-7.C2
-rw-r--r--gcc/testsuite/g++.dg/ext/weak2.C17
22 files changed, 822 insertions, 3 deletions
diff --git a/gcc/testsuite/g++.dg/ext/altivec-apple-11.C b/gcc/testsuite/g++.dg/ext/altivec-apple-11.C
new file mode 100644
index 00000000000..c5104b2635b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/altivec-apple-11.C
@@ -0,0 +1,18 @@
+/* APPLE LOCAL file AltiVec */
+/* This is a compile-only test for interaction of "-maltivec" and "-save-temps". */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-options "-save-temps -maltivec" } */
+
+#define vector_float vector float
+#define vector_float_foo vector float foo
+#define vector_float_bar_eq vector float bar =
+
+/* NB: Keep the following split across three lines. */
+vector
+int
+a1 = { 100, 200, 300, 400 };
+
+vector_float f1 = { 1.0, 2.0, 3.0, 4.0 };
+vector_float_foo = { 3.0, 4.0, 5.0, 6.0 };
+vector_float_bar_eq { 8.0, 7.0, 6.0, 5.0 };
diff --git a/gcc/testsuite/g++.dg/ext/apple-altivec-1.C b/gcc/testsuite/g++.dg/ext/apple-altivec-1.C
new file mode 100644
index 00000000000..2726c81b3af
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/apple-altivec-1.C
@@ -0,0 +1,43 @@
+/* APPLE LOCAL file AltiVec */
+/* Additional AltiVec PIM argument type combinations. */
+
+/* { dg-do compile { target powerpc*-*-darwin* } } */
+/* { dg-options "-faltivec -Wall" } */
+
+vector signed int
+LoadUnalignedSI( signed int *p)
+{
+ vector signed int vload1 = vec_ld( 0, (vector signed int *)p);
+ if ( ((long)p) * 0xF){
+ vector signed int vload2 = vec_ld( 16, (vector signed int *)p);
+ vector unsigned char vperm = vec_ldl( 0, p);
+
+ vload1 = vec_perm(vload1, vload2, vperm);
+ }
+ return vload1;
+}
+
+inline vector float Reciprocal( vector float v )
+{
+
+ vector float estimate = vec_re( v );
+
+ return vec_madd( vec_nmsub( estimate, v, (vector float) (1.0) ), estimate, estimate );
+}
+
+void foo(void) {
+ vector bool char vbc1 = (vector bool char)(255);
+ vector pixel vp1, vp2;
+ vector float vf1, vf2;
+ vector unsigned char vuc1;
+ vector unsigned short vus1, vus2;
+ vector bool short vbs1, vbs2;
+ vector signed short vss1;
+ vector signed int vsi1, vsi2;
+ vbc1 = vec_splat (vbc1, 9);
+ vp2 = vec_splat (vp1, 7);
+ vf1 = vec_splat (vf2, 31);
+ vuc1 = vec_pack (vus1, vus2);
+ vbc1 = vec_pack (vbs1, vbs2);
+ vss1 = vec_pack (vsi1, vsi2);
+}
diff --git a/gcc/testsuite/g++.dg/ext/apple-altivec-2.C b/gcc/testsuite/g++.dg/ext/apple-altivec-2.C
new file mode 100644
index 00000000000..6e3d959bb3d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/apple-altivec-2.C
@@ -0,0 +1,398 @@
+/* APPLE LOCAL file AltiVec */
+/* Check for presence of AltiVec PIM "specific operations". */
+
+/* { dg-do compile { target powerpc*-*-darwin* } } */
+/* { dg-options "-faltivec -Wall" } */
+
+vector signed int
+specific_operations( signed int *p)
+{
+ vector unsigned int vui1, vui2;
+ vector unsigned short vus1, vus2;
+ vector unsigned char vuc1, vuc2;
+ vector signed int vsi1, vsi2;
+ vector signed short vss1, vss2;
+ vector signed char vsc1, vsc2;
+ vector bool int vbi1, vbi2;
+ vector bool short vbs1, vbs2;
+ vector bool char vbc1, vbc2;
+ vector float vf1, vf2;
+ vector pixel vp1, vp2;
+
+ vuc1 = vec_lvebx (8, (unsigned char *)p);
+ vss1 = vec_lvehx (4, (short *)p);
+ vf1 = vec_lvewx (2, (float *)p);
+
+ vsi1 = vec_lvx (1, (vector signed int *)p);
+ vp1 = vec_lvxl (16, (vector pixel *)p);
+
+ vec_stvebx (vuc1, 2, (char *)p);
+ vec_stvehx (vp1, 4, (unsigned short *)p);
+ vec_stvewx (vf1, 1, (float *)p);
+
+ vec_stvx (vbi1, 12, (vector int bool *)p);
+ vec_stvxl (vp1, 11, (vector pixel *)p);
+
+ vui1 = vec_vaddcuw (vui1, vui2);
+ vf1 = vec_vaddfp (vf1, vf2);
+
+ vsc1 = vec_vaddsbs (vsc1, vsc2);
+ vss1 = vec_vaddshs (vss1, vss2);
+ vsi1 = vec_vaddsws (vsi1, vsi2);
+ vuc1 = vec_vaddubs (vuc1, vuc2);
+ vus1 = vec_vadduhs (vus1, vus2);
+ vui1 = vec_vadduws (vui1, vui2);
+ vuc1 = vec_vaddubm (vuc1, vuc2);
+ vus1 = vec_vadduhm (vus1, vus2);
+ vui1 = vec_vadduwm (vui1, vui2);
+
+ vsc1 = vec_vand (vsc1, vsc2);
+ vss1 = vec_vandc (vss1, vss2);
+
+ vsc1 = vec_vavgsb (vsc1, vsc2);
+ vss1 = vec_vavgsh (vss1, vss2);
+ vsi1 = vec_vavgsw (vsi1, vsi2);
+ vuc1 = vec_vavgub (vuc1, vuc2);
+ vus1 = vec_vavguh (vus1, vus2);
+ vui1 = vec_vavguw (vui1, vui2);
+
+ vf1 = vec_vcfsx (vsi1, 4);
+ vf2 = vec_vcfux (vui1, 3);
+
+ vsi1 = vec_vcmpbfp (vf1, vf2);
+ vbi1 = vec_vcmpeqfp (vf1, vf2);
+
+ vbc1 = vec_vcmpequb (vuc1, vuc2);
+ vbs2 = vec_vcmpequh (vus1, vus2);
+ vbi1 = vec_vcmpequw (vui1, vui2);
+
+ vbi1 = vec_vcmpgefp (vf1, vf2);
+ vbi2 = vec_vcmpgtfp (vf1, vf2);
+
+ vbc1 = vec_vcmpgtsb (vsc1, vsc2);
+ vbs1 = vec_vcmpgtsh (vss1, vss2);
+ vbi1 = vec_vcmpgtsw (vsi1, vsi2);
+
+ vbc1 = vec_vcmpgtub (vuc1, vuc2);
+ vbs1 = vec_vcmpgtuh (vus1, vus2);
+ vbi1 = vec_vcmpgtuw (vui1, vui2);
+
+ vsi1 = vec_vctsxs (vf1, 22);
+ vui1 = vec_vctuxs (vf2, 30);
+
+ vf2 = vec_vexptefp (vf1);
+ vf1 = vec_vlogefp (vf2);
+ vf2 = vec_vmaddfp (vf1, vf2, vf2);
+
+ vf1 = vec_vmaxfp (vf1, vf2);
+
+ vsc1 = vec_vmaxsb (vsc1, vsc2);
+ vss1 = vec_vmaxsh (vss1, vss2);
+ vsi1 = vec_vmaxsw (vsi1, vsi2);
+ vuc1 = vec_vmaxub (vuc1, vuc2);
+ vus1 = vec_vmaxuh (vus1, vus2);
+ vui1 = vec_vmaxuw (vui1, vui2);
+
+ vbc1 = vec_vmrghb (vbc1, vbc2);
+ vp1 = vec_vmrghh (vp1, vp2);
+ vf2 = vec_vmrghw (vf2, vf1);
+
+ vbc1 = vec_vmrglb (vbc1, vbc2);
+ vp1 = vec_vmrglh (vp1, vp2);
+ vf2 = vec_vmrglw (vf2, vf1);
+
+ vf1 = vec_vminfp (vf1, vf2);
+
+ vsc1 = vec_vminsb (vsc1, vsc2);
+ vss1 = vec_vminsh (vss1, vss2);
+ vsi1 = vec_vminsw (vsi1, vsi2);
+ vuc1 = vec_vminub (vuc1, vuc2);
+ vus1 = vec_vminuh (vus1, vus2);
+ vui1 = vec_vminuw (vui1, vui2);
+
+ vss1 = vec_vmhaddshs (vss1, vss2, vss2);
+ vss2 = vec_vmhraddshs (vss1, vss2, vss2);
+ vus1 = vec_vmladduhm (vus1, vus1, vus2);
+ vui1 = vec_vmsumubm (vuc1, vuc2, vui1);
+ vsi1 = vec_vmsummbm (vsc1, vuc2, vsi1);
+ vsi2 = vec_vmsumshm (vss1, vss2, vsi1);
+ vui1 = vec_vmsumuhm (vus1, vus2, vui2);
+ vui2 = vec_vmsumuhs (vus1, vus2, vui1);
+ vsi2 = vec_vmsumshs (vss1, vss1, vsi2);
+
+ vus1 = vec_vmuleub (vuc1, vuc2);
+ vss1 = vec_vmulesb (vsc1, vsc2);
+ vui1 = vec_vmuleuh (vus1, vus2);
+ vsi1 = vec_vmulesh (vss1, vss2);
+
+ vus2 = vec_vmuloub (vuc1, vuc2);
+ vss2 = vec_vmulosb (vsc1, vsc2);
+ vui2 = vec_vmulouh (vus1, vus2);
+ vsi2 = vec_vmulosh (vss1, vss2);
+
+ vf1 = vec_vnmsubfp (vf1, vf2, vf1);
+
+ vp1 = vec_vnor (vp1, vp2);
+ vf2 = vec_vor (vf2, vbi1);
+ vf2 = vec_vxor (vf2, vbi1);
+
+ vsc1 = vec_vpkuhum (vss1, vss2);
+ vbs1 = vec_vpkuwum (vbi1, vbi2);
+ vp1 = vec_vpkpx (vui1, vui2);
+ vuc1 = vec_vpkuhus (vus1, vus1);
+ vsc1 = vec_vpkshss (vss1, vss2);
+ vus1 = vec_vpkuwus (vui1, vui2);
+ vss2 = vec_vpkswss (vsi1, vsi1);
+ vuc1 = vec_vpkshus (vss1, vss2);
+ vus1 = vec_vpkswus (vsi1, vsi1);
+
+ vp1 = vec_vperm (vp1, vp2, vuc1);
+
+ vf1 = vec_vrefp (vf2);
+ vf2 = vec_vrfin (vf1);
+ vf1 = vec_vrsqrtefp (vf2);
+
+ vuc1 = vec_vrlb (vuc1, vuc2);
+ vss1 = vec_vrlh (vss2, vss1);
+ vui2 = vec_vrlw (vui2, vui1);
+
+ vf1 = vec_vsel (vf2, vf1, vbi1);
+
+ vuc1 = vec_vslb (vuc1, vuc2);
+ vss1 = vec_vslh (vss2, vss1);
+ vui2 = vec_vslw (vui2, vui1);
+
+ vp1 = vec_vsldoi (vp2, vp1, 14);
+ vp2 = vec_vsl (vp1, vuc1);
+ vp1 = vec_vslo (vp2, vuc1);
+
+ vbc1 = vec_vspltb (vbc1, 9);
+ vp2 = vec_vsplth (vp1, 7);
+ vf1 = vec_vspltw (vf2, 31);
+ vsc2 = vec_vspltisb (30);
+ vss1 = vec_vspltish (29);
+ vsi1 = vec_vspltisw (28);
+
+ vuc1 = vec_vsrb (vuc1, vuc2);
+ vss1 = vec_vsrh (vss2, vss1);
+ vui2 = vec_vsrw (vui2, vui1);
+ vuc2 = vec_vsrab (vuc1, vuc2);
+ vss2 = vec_vsrah (vss2, vss1);
+ vui1 = vec_vsraw (vui2, vui1);
+ vp2 = vec_vsr (vp1, vuc1);
+ vp1 = vec_vsro (vp2, vuc1);
+
+ vui1 = vec_vsubcuw (vui1, vui2);
+ vf1 = vec_vsubfp (vf1, vf2);
+
+ vsc1 = vec_vsubsbs (vsc1, vsc2);
+ vss1 = vec_vsubshs (vss1, vss2);
+ vsi1 = vec_vsubsws (vsi1, vsi2);
+ vuc1 = vec_vsububs (vuc1, vuc2);
+ vus1 = vec_vsubuhs (vus1, vus2);
+ vui1 = vec_vsubuws (vui1, vui2);
+ vuc1 = vec_vsububm (vuc1, vuc2);
+ vus1 = vec_vsubuhm (vus1, vus2);
+ vui1 = vec_vsubuwm (vui1, vui2);
+
+ vui2 = vec_vsum4ubs (vuc1, vui1);
+ vsi1 = vec_vsum4sbs (vsc2, vsi1);
+ vsi1 = vec_vsum2sws (vsi1, vsi1);
+ vsi2 = vec_vsumsws (vsi2, vsi1);
+
+ vf2 = vec_vrfiz (vf1);
+
+ vbs1 = vec_vupkhsb (vbc1);
+ vui1 = vec_vupkhpx (vp1);
+ vbi1 = vec_vupkhsh (vbs1);
+
+ vss1 = vec_vupklsb (vsc1);
+ vui1 = vec_vupklpx (vp2);
+ vbi1 = vec_vupklsh (vbs1);
+
+ return vsi1;
+}
+
+/* { dg-final { scan-assembler "\tlvebx " } } */
+/* { dg-final { scan-assembler "\tlvehx " } } */
+/* { dg-final { scan-assembler "\tlvewx " } } */
+/* { dg-final { scan-assembler "\tlvx " } } */
+/* { dg-final { scan-assembler "\tlvxl " } } */
+/* { dg-final { scan-assembler "\tstvebx " } } */
+/* { dg-final { scan-assembler "\tstvehx " } } */
+/* { dg-final { scan-assembler "\tstvewx " } } */
+/* { dg-final { scan-assembler "\tstvx " } } */
+/* { dg-final { scan-assembler "\tstvxl " } } */
+
+/* { dg-final { scan-assembler "\tvaddcuw " } } */
+/* { dg-final { scan-assembler "\tvaddfp " } } */
+/* { dg-final { scan-assembler "\tvaddsbs " } } */
+/* { dg-final { scan-assembler "\tvaddshs " } } */
+/* { dg-final { scan-assembler "\tvaddsws " } } */
+/* { dg-final { scan-assembler "\tvaddubs " } } */
+/* { dg-final { scan-assembler "\tvadduhs " } } */
+/* { dg-final { scan-assembler "\tvadduws " } } */
+/* { dg-final { scan-assembler "\tvaddubm " } } */
+/* { dg-final { scan-assembler "\tvadduhm " } } */
+/* { dg-final { scan-assembler "\tvadduwm " } } */
+
+/* { dg-final { scan-assembler "\tvand " } } */
+/* { dg-final { scan-assembler "\tvandc " } } */
+
+/* { dg-final { scan-assembler "\tvavgsb " } } */
+/* { dg-final { scan-assembler "\tvavgsh " } } */
+/* { dg-final { scan-assembler "\tvavgsw " } } */
+/* { dg-final { scan-assembler "\tvavgub " } } */
+/* { dg-final { scan-assembler "\tvavguh " } } */
+/* { dg-final { scan-assembler "\tvavguw " } } */
+
+/* { dg-final { scan-assembler "\tvcfsx " } } */
+/* { dg-final { scan-assembler "\tvcfux " } } */
+
+/* { dg-final { scan-assembler "\tvcmpbfp " } } */
+/* { dg-final { scan-assembler "\tvcmpeqfp " } } */
+
+/* { dg-final { scan-assembler "\tvcmpequb " } } */
+/* { dg-final { scan-assembler "\tvcmpequh " } } */
+/* { dg-final { scan-assembler "\tvcmpequw " } } */
+
+/* { dg-final { scan-assembler "\tvcmpgefp " } } */
+/* { dg-final { scan-assembler "\tvcmpgtfp " } } */
+
+/* { dg-final { scan-assembler "\tvcmpgtsb " } } */
+/* { dg-final { scan-assembler "\tvcmpgtsh " } } */
+/* { dg-final { scan-assembler "\tvcmpgtsw " } } */
+
+/* { dg-final { scan-assembler "\tvcmpgtub " } } */
+/* { dg-final { scan-assembler "\tvcmpgtuh " } } */
+/* { dg-final { scan-assembler "\tvcmpgtuw " } } */
+
+/* { dg-final { scan-assembler "\tvctsxs " } } */
+/* { dg-final { scan-assembler "\tvctuxs " } } */
+
+/* { dg-final { scan-assembler "\tvexptefp " } } */
+/* { dg-final { scan-assembler "\tvlogefp " } } */
+/* { dg-final { scan-assembler "\tvmaddfp " } } */
+
+/* { dg-final { scan-assembler "\tvmaxfp " } } */
+/* { dg-final { scan-assembler "\tvmaxsb " } } */
+/* { dg-final { scan-assembler "\tvmaxsh " } } */
+/* { dg-final { scan-assembler "\tvmaxsw " } } */
+/* { dg-final { scan-assembler "\tvmaxub " } } */
+/* { dg-final { scan-assembler "\tvmaxuh " } } */
+/* { dg-final { scan-assembler "\tvmaxuw " } } */
+
+/* { dg-final { scan-assembler "\tvmrghb " } } */
+/* { dg-final { scan-assembler "\tvmrghh " } } */
+/* { dg-final { scan-assembler "\tvmrghw " } } */
+
+/* { dg-final { scan-assembler "\tvmrglb " } } */
+/* { dg-final { scan-assembler "\tvmrglh " } } */
+/* { dg-final { scan-assembler "\tvmrglw " } } */
+
+/* { dg-final { scan-assembler "\tvminfp " } } */
+/* { dg-final { scan-assembler "\tvminsb " } } */
+/* { dg-final { scan-assembler "\tvminsh " } } */
+/* { dg-final { scan-assembler "\tvminsw " } } */
+/* { dg-final { scan-assembler "\tvminub " } } */
+/* { dg-final { scan-assembler "\tvminuh " } } */
+/* { dg-final { scan-assembler "\tvminuw " } } */
+
+/* { dg-final { scan-assembler "\tvmhaddshs " } } */
+/* { dg-final { scan-assembler "\tvmhraddshs " } } */
+/* { dg-final { scan-assembler "\tvmladduhm " } } */
+/* { dg-final { scan-assembler "\tvmsumubm " } } */
+/* { dg-final { scan-assembler "\tvmsummbm " } } */
+/* { dg-final { scan-assembler "\tvmsumshm " } } */
+/* { dg-final { scan-assembler "\tvmsumuhm " } } */
+/* { dg-final { scan-assembler "\tvmsumuhs " } } */
+/* { dg-final { scan-assembler "\tvmsumshs " } } */
+
+/* { dg-final { scan-assembler "\tvmuleub " } } */
+/* { dg-final { scan-assembler "\tvmulesb " } } */
+/* { dg-final { scan-assembler "\tvmuleuh " } } */
+/* { dg-final { scan-assembler "\tvmulesh " } } */
+
+/* { dg-final { scan-assembler "\tvmuloub " } } */
+/* { dg-final { scan-assembler "\tvmulosb " } } */
+/* { dg-final { scan-assembler "\tvmulouh " } } */
+/* { dg-final { scan-assembler "\tvmulosh " } } */
+
+/* { dg-final { scan-assembler "\tvnmsubfp " } } */
+
+/* { dg-final { scan-assembler "\tvnor " } } */
+/* { dg-final { scan-assembler "\tvor " } } */
+/* { dg-final { scan-assembler "\tvxor " } } */
+
+/* { dg-final { scan-assembler "\tvpkuhum " } } */
+/* { dg-final { scan-assembler "\tvpkuwum " } } */
+/* { dg-final { scan-assembler "\tvpkpx " } } */
+/* { dg-final { scan-assembler "\tvpkuhus " } } */
+/* { dg-final { scan-assembler "\tvpkshss " } } */
+/* { dg-final { scan-assembler "\tvpkuwus " } } */
+/* { dg-final { scan-assembler "\tvpkswss " } } */
+/* { dg-final { scan-assembler "\tvpkshus " } } */
+/* { dg-final { scan-assembler "\tvpkswus " } } */
+
+/* { dg-final { scan-assembler "\tvperm " } } */
+
+/* { dg-final { scan-assembler "\tvrefp " } } */
+/* { dg-final { scan-assembler "\tvrfin " } } */
+/* { dg-final { scan-assembler "\tvrsqrtefp " } } */
+
+/* { dg-final { scan-assembler "\tvrlb " } } */
+/* { dg-final { scan-assembler "\tvrlh " } } */
+/* { dg-final { scan-assembler "\tvrlw " } } */
+
+/* { dg-final { scan-assembler "\tvsel " } } */
+
+/* { dg-final { scan-assembler "\tvslb " } } */
+/* { dg-final { scan-assembler "\tvslh " } } */
+/* { dg-final { scan-assembler "\tvslw " } } */
+
+/* { dg-final { scan-assembler "\tvsldoi " } } */
+/* { dg-final { scan-assembler "\tvsl " } } */
+/* { dg-final { scan-assembler "\tvslo " } } */
+
+/* { dg-final { scan-assembler "\tvspltb " } } */
+/* { dg-final { scan-assembler "\tvsplth " } } */
+/* { dg-final { scan-assembler "\tvspltw " } } */
+/* { dg-final { scan-assembler "\tvspltisb " } } */
+/* { dg-final { scan-assembler "\tvspltish " } } */
+/* { dg-final { scan-assembler "\tvspltisw " } } */
+
+/* { dg-final { scan-assembler "\tvsrb " } } */
+/* { dg-final { scan-assembler "\tvsrh " } } */
+/* { dg-final { scan-assembler "\tvsrw " } } */
+/* { dg-final { scan-assembler "\tvsrab " } } */
+/* { dg-final { scan-assembler "\tvsrah " } } */
+/* { dg-final { scan-assembler "\tvsraw " } } */
+/* { dg-final { scan-assembler "\tvsr " } } */
+/* { dg-final { scan-assembler "\tvsro " } } */
+
+/* { dg-final { scan-assembler "\tvsubcuw " } } */
+/* { dg-final { scan-assembler "\tvsubfp " } } */
+/* { dg-final { scan-assembler "\tvsubsbs " } } */
+/* { dg-final { scan-assembler "\tvsubshs " } } */
+/* { dg-final { scan-assembler "\tvsubsws " } } */
+/* { dg-final { scan-assembler "\tvsububs " } } */
+/* { dg-final { scan-assembler "\tvsubuhs " } } */
+/* { dg-final { scan-assembler "\tvsubuws " } } */
+/* { dg-final { scan-assembler "\tvsububm " } } */
+/* { dg-final { scan-assembler "\tvsubuhm " } } */
+/* { dg-final { scan-assembler "\tvsubuwm " } } */
+
+/* { dg-final { scan-assembler "\tvsum4ubs " } } */
+/* { dg-final { scan-assembler "\tvsum4sbs " } } */
+/* { dg-final { scan-assembler "\tvsum2sws " } } */
+/* { dg-final { scan-assembler "\tvsumsws " } } */
+
+/* { dg-final { scan-assembler "\tvrfiz " } } */
+
+/* { dg-final { scan-assembler "\tvupkhsb " } } */
+/* { dg-final { scan-assembler "\tvupkhpx " } } */
+/* { dg-final { scan-assembler "\tvupkhsh " } } */
+
+/* { dg-final { scan-assembler "\tvupklsb " } } */
+/* { dg-final { scan-assembler "\tvupklpx " } } */
+/* { dg-final { scan-assembler "\tvupklsh " } } */
diff --git a/gcc/testsuite/g++.dg/ext/apple-altivec-3.C b/gcc/testsuite/g++.dg/ext/apple-altivec-3.C
new file mode 100644
index 00000000000..b095b88eee4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/apple-altivec-3.C
@@ -0,0 +1,18 @@
+/* APPLE LOCAL file AltiVec */
+/* Vectors in template functions. */
+
+/* { dg-do compile { target powerpc*-*-darwin* } } */
+/* { dg-options "-faltivec -Wall" } */
+
+template<int I>
+void FooBar()
+{
+ vector unsigned char va, vb, vc;
+ vc = (vector unsigned char)vec_mergeh((vector unsigned short)va, (vector unsigned short)vb);
+}
+
+int main (int argc, char * const argv[])
+{
+ FooBar<0>();
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/ext/apple-altivec-4.C b/gcc/testsuite/g++.dg/ext/apple-altivec-4.C
new file mode 100644
index 00000000000..0bb1dcd1d3a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/apple-altivec-4.C
@@ -0,0 +1,15 @@
+/* APPLE LOCAL file AltiVec */
+/* { dg-do compile { target powerpc*-*-* } } */
+/* { dg-options "-faltivec" } */
+/* Existing AltiVec PIM implementations allow numeric literals with
+ any number of bits, so long as the value is within allowed range. */
+int foo(void)
+{
+ vector unsigned char amask = vec_splat_u8 ( 0xFFFFFFF3L );
+ vector signed short bmask = vec_splat_s16 ( 0xFFFFFFFFFFFFFFF1LL );
+}
+
+
+/* { dg-final { scan-assembler "vspltisb.+\\-13" } } */
+/* { dg-final { scan-assembler "vspltish.+\\-15" } } */
+
diff --git a/gcc/testsuite/g++.dg/ext/apple-altivec-5.C b/gcc/testsuite/g++.dg/ext/apple-altivec-5.C
new file mode 100644
index 00000000000..4473881dda7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/apple-altivec-5.C
@@ -0,0 +1,31 @@
+/* APPLE LOCAL file AltiVec */
+/* Test for handling of reference vector parameters. */
+/* { dg-do compile { target powerpc*-*-darwin* } } */
+/* { dg-options "-faltivec" } */
+
+struct Vect
+{
+ typedef vector unsigned int vector_1;
+
+ static vector_1 ConvertPixel1(const vector_1 &source, const vector unsigned char &vp);
+ static vector_1 ConvertPixel2(const vector_1 source, const vector unsigned char vp);
+ static vector_1 ConvertPixel3(vector_1 &source, vector unsigned char &vp);
+ static vector_1 ConvertPixel4(vector_1 source, vector unsigned char vp);
+};
+
+Vect::vector_1 Vect::ConvertPixel1(const vector_1 &source, const vector unsigned char &vp)
+{
+ return (vector_1) vec_perm(source, source, vp);
+}
+Vect::vector_1 Vect::ConvertPixel2(const vector_1 source, const vector unsigned char vp)
+{
+ return (vector_1) vec_perm(source, source, vp);
+}
+Vect::vector_1 Vect::ConvertPixel3(vector_1 &source, vector unsigned char &vp)
+{
+ return (vector_1) vec_perm(source, source, vp);
+}
+Vect::vector_1 Vect::ConvertPixel4(vector_1 source, vector unsigned char vp)
+{
+ return (vector_1) vec_perm(source, source, vp);
+}
diff --git a/gcc/testsuite/g++.dg/ext/apple-altivec-6.C b/gcc/testsuite/g++.dg/ext/apple-altivec-6.C
new file mode 100644
index 00000000000..7a74578d477
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/apple-altivec-6.C
@@ -0,0 +1,15 @@
+/* APPLE LOCAL file AltiVec */
+/* Test for handling of volatile reference vector parameters. */
+/* { dg-do compile { target powerpc*-*-darwin* } } */
+/* { dg-options "-faltivec" } */
+
+int foo(volatile vector float &i, int &j)
+{
+ vector unsigned char zero = vec_splat_u8(0);
+ vector unsigned char one = vec_splat_u8(1);
+ i = vec_add( (vector float)zero, (vector float)one );
+ j = 5;
+ return 0;
+}
+
+/* { dg-final { scan-assembler "Z3fooRVU8__vectorfRi" } } */
diff --git a/gcc/testsuite/g++.dg/ext/attrib20.C b/gcc/testsuite/g++.dg/ext/attrib20.C
new file mode 100644
index 00000000000..e46e8ae2077
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attrib20.C
@@ -0,0 +1,23 @@
+// { dg-do compile }
+// { dg-options "-g" }
+// Origin: <jan at etpmod dot phys dot tue dot nl>
+// PR c++/19508: avoid attributes for template parameters
+
+template <typename T>
+struct BVector
+{
+ typedef T T2;
+ typedef T value_type __attribute__ ((aligned(8))); // { dg-bogus "attribute" "attribute" { xfail *-*-* } }
+ typedef T2 value_type2 __attribute__ ((aligned(8))); // { dg-bogus "attribute" "attribute" { xfail *-*-* } }
+ value_type v;
+};
+BVector<int> m;
+
+template <template <class> class T>
+struct BV2
+{
+ typedef T<float> value_type __attribute__((aligned(8))); // { dg-bogus "attribute" "attribute" { xfail *-*-* } }
+ value_type v;
+};
+BV2<BVector> m2;
+
diff --git a/gcc/testsuite/g++.dg/ext/attrib21.C b/gcc/testsuite/g++.dg/ext/attrib21.C
new file mode 100644
index 00000000000..2fc5800b05e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/attrib21.C
@@ -0,0 +1,17 @@
+// PR c++/20763
+
+typedef void *voidp;
+
+struct S
+{
+ char a;
+ voidp __attribute__ ((aligned (16))) b;
+};
+
+struct T
+{
+ char a;
+ void *__attribute__ ((aligned (16))) b;
+};
+
+int f[sizeof (struct S) != sizeof (struct T) ? -1 : 1];
diff --git a/gcc/testsuite/g++.dg/ext/lvalue-cast-1.C b/gcc/testsuite/g++.dg/ext/lvalue-cast-1.C
new file mode 100644
index 00000000000..ebee754f069
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/lvalue-cast-1.C
@@ -0,0 +1,34 @@
+/* APPLE LOCAL file non lvalue assign */
+/* { dg-do run } */
+/* { dg-options "-fnon-lvalue-assign" } */
+
+#include <stdlib.h>
+#define CHECK_IF(expr) if (!(expr)) abort ()
+
+static int global;
+
+void f(int &) { global = 35; }
+void f(const int &) { global = 78; }
+
+long long_arr[2];
+
+int main(void) {
+
+ char *p;
+
+ (long *)p = long_arr; /* { dg-warning "target of assignment not really an lvalue" } */
+ ((long *)p)++; /* { dg-warning "target of assignment not really an lvalue" } */
+ *(long *)p = -1;
+
+ *p = -2;
+ CHECK_IF(p[-1] == 0 && p[0] == -2 && p[1] == -1);
+
+ (long *)p += 2; /* { dg-warning "target of assignment not really an lvalue" } */
+ (long *)p -= 2; /* { dg-warning "target of assignment not really an lvalue" } */
+
+ long x = 0;
+ f((int)x);
+ CHECK_IF(global == 78);
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/ext/lvalue-cast-2.C b/gcc/testsuite/g++.dg/ext/lvalue-cast-2.C
new file mode 100644
index 00000000000..bfd2e29e52c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/lvalue-cast-2.C
@@ -0,0 +1,14 @@
+/* APPLE LOCAL file non lvalue assign */
+/* Allow lvalue casts in conjunction with '&'. */
+/* { dg-do compile } */
+/* { dg-options "-fnon-lvalue-assign" } */
+
+int foo (void **ptr) {
+ return 1;
+}
+
+int bar (void) {
+ char *string;
+
+ return foo ((void **)&((char *)string)); /* { dg-warning "argument to .&. not really an lvalue" } */
+}
diff --git a/gcc/testsuite/g++.dg/ext/lvalue-cond-1.C b/gcc/testsuite/g++.dg/ext/lvalue-cond-1.C
new file mode 100644
index 00000000000..ad059afe9b6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/lvalue-cond-1.C
@@ -0,0 +1,32 @@
+/* APPLE LOCAL file non lvalue assign */
+/* Allow assignments to conditional expressions, as long as the second and third
+ operands are already lvalues. */
+/* NB: It turns out that C++ (unlike C) already allows these as lvalues, and so
+ no warnings whatsoever will be produced. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+/* { dg-options "-fnon-lvalue-assign" } */
+/* { dg-do run } */
+
+#include <stdlib.h>
+
+int g1 = 3, g2 = 5;
+
+void assign_val1 (int which, int value) {
+ (which ? g1 : g2) = value; /* { dg-bogus "target of assignment not really an lvalue" } */
+}
+
+void assign_val2 (int which) {
+ (which ? g1 : g2)++; /* { dg-bogus "target of assignment not really an lvalue" } */
+}
+
+int main(void) {
+ assign_val1 (0, 15);
+ if (g1 != 3 || g2 != 15)
+ abort ();
+
+ assign_val2 (1);
+ if (g1 != 4 || g2 != 15)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/ext/new-delete-1.C b/gcc/testsuite/g++.dg/ext/new-delete-1.C
new file mode 100644
index 00000000000..8f09183ab7a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/new-delete-1.C
@@ -0,0 +1,28 @@
+/* APPLE LOCAL file coalescing */
+/* Make sure that non-weak '::new' and '::delete' operators do not wind
+ up in a coalesced section. Whether or not they get called via a stub
+ from within the same translation unit is an issue we defer for later
+ (i.e., Positron); when called from other translation units, they do
+ need a stub. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+/* { dg-do compile { target powerpc*-*-darwin* } } */
+
+extern "C" void free(void *);
+
+void operator delete(void*) throw();
+void operator delete(void* p) throw() { free(p); }
+
+void operator delete(void*, int) throw();
+
+void *operator new(unsigned long) throw();
+void *operator new(unsigned long) throw() { return (void *)0; }
+
+int *foo(void) {
+ int *n = new int();
+ ::operator delete(n, 0);
+ ::operator delete(n);
+ return 0;
+}
+
+/* { dg-final { scan-assembler-not "coal" } } */
+/* { dg-final { scan-assembler "bl L__ZdlPvi.stub" } } */
diff --git a/gcc/testsuite/g++.dg/ext/new-delete-2.C b/gcc/testsuite/g++.dg/ext/new-delete-2.C
new file mode 100644
index 00000000000..72d6b9e3ae1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/new-delete-2.C
@@ -0,0 +1,28 @@
+/* APPLE LOCAL file coalescing */
+/* Make sure that weak '::new' and '::delete' operators wind
+ up in a coalesced section and get called via a stub. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+/* { dg-do compile { target powerpc*-*-darwin* } } */
+
+extern "C" void free(void *);
+
+void operator delete(void*) throw() __attribute__((weak));
+void operator delete(void* p) throw() { free(p); }
+
+void operator delete(void*, int) throw() __attribute__((weak));
+
+void *operator new(unsigned long) throw() __attribute__((weak));
+void *operator new(unsigned long) throw() { return (void *)0; }
+
+int *foo(void) {
+ int *n = new int();
+ ::operator delete(n, 0);
+ ::operator delete(n);
+ return 0;
+}
+
+/* { dg-final { scan-assembler "coal" } } */
+
+/* { dg-final { scan-assembler "bl L__Znwm.stub" } } */
+/* { dg-final { scan-assembler "bl L__ZdlPvi.stub" } } */
+/* { dg-final { scan-assembler "bl L__ZdlPv.stub" } } */
diff --git a/gcc/testsuite/g++.dg/ext/opt-pragma-2.C b/gcc/testsuite/g++.dg/ext/opt-pragma-2.C
new file mode 100644
index 00000000000..f44285a2f9c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/opt-pragma-2.C
@@ -0,0 +1,27 @@
+/* APPLE LOCAL file */
+#include <stdio.h>
+/* Radar 3124235 */
+/* { dg-do compile { target "powerpc*-*-darwin*" } } */
+/* { dg-options "-O3" } */
+void f4(int);
+#pragma optimization_level 0
+void f1(int x) {
+ printf("%d\n", x);
+}
+#pragma GCC optimize_for_size on
+#pragma GCC optimization_level 0
+void f4(int x) {
+ printf("%d\n", x);
+}
+#pragma GCC optimization_level 0
+void f5(int x) {
+#pragma GCC optimization_level 2
+ printf("%d\n", x);
+}
+#pragma GCC optimization_level reset
+void f6(int x) {
+ printf("%d\n", x);
+}
+/* Make sure sibling call optimization is not applied. */
+/* { dg-final { scan-assembler-times "b L_printf" 0 } } */
+/* { dg-final { scan-assembler-times "bl L_printf" 4 } } */
diff --git a/gcc/testsuite/g++.dg/ext/opt-pragma-3.C b/gcc/testsuite/g++.dg/ext/opt-pragma-3.C
new file mode 100644
index 00000000000..dcb4845cc21
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/opt-pragma-3.C
@@ -0,0 +1,27 @@
+/* APPLE LOCAL file */
+#include <stdio.h>
+/* Radar 3124235 */
+/* { dg-do compile { target "powerpc*-*-darwin*" } } */
+/* { dg-options "-O0" } */
+void f4(int);
+#pragma optimization_level 3
+void f1(int x) {
+ printf("%d\n", x);
+}
+#pragma GCC optimize_for_size on
+#pragma GCC optimization_level 3
+void f4(int x) {
+ printf("%d\n", x);
+}
+#pragma GCC optimization_level 3
+void f5(int x) {
+#pragma GCC optimization_level 0
+ printf("%d\n", x);
+}
+#pragma GCC optimization_level reset
+void f6(int x) {
+ printf("%d\n", x);
+}
+/* Make sure sibling call optimization is applied. */
+/* { dg-final { scan-assembler-times "b L_printf" 4 } } */
+/* { dg-final { scan-assembler-times "bl L_printf" 0 } } */
diff --git a/gcc/testsuite/g++.dg/ext/opt-pragma-4.C b/gcc/testsuite/g++.dg/ext/opt-pragma-4.C
new file mode 100644
index 00000000000..60064ab768d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/opt-pragma-4.C
@@ -0,0 +1,26 @@
+/* APPLE LOCAL file */
+#include <stdio.h>
+/* Radar 3124235 */
+/* { dg-do compile { target "powerpc*-*-darwin*" } } */
+/* { dg-options "-O0" } */
+void f4(int);
+#pragma optimization_level 3
+void f1(int x) {
+ printf("%d\n", x);
+}
+#pragma GCC optimize_for_size on
+#pragma GCC optimization_level 3
+void f4(int x) {
+ printf("%d\n", x);
+}
+#pragma GCC optimization_level 0
+void f5(int x) {
+#pragma GCC optimization_level 2
+ printf("%d\n", x);
+}
+#pragma GCC optimization_level reset
+void f6(int x) {
+ printf("%d\n", x);
+}
+/* { dg-final { scan-assembler-times "b L_printf" 2 } } */
+/* { dg-final { scan-assembler-times "bl L_printf" 2 } } */
diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr4.C b/gcc/testsuite/g++.dg/ext/stmtexpr4.C
new file mode 100644
index 00000000000..a37c33ae086
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/stmtexpr4.C
@@ -0,0 +1,8 @@
+// PR c++/20147
+// { dg-do compile }
+// { dg-options "" }
+
+void foo()
+{
+ ({x;}); // { dg-error "was not declared" }
+}
diff --git a/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C b/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C
index a2c93ebb752..e292df41b4c 100644
--- a/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C
+++ b/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C
@@ -1,6 +1,6 @@
/* Test that #pragma GCC visibility does not override class member specific settings. */
/* { dg-do compile } */
-/* { dg-require-visibility "" } */
+/* { dg-require-visibility "internal" } */
/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */
#pragma GCC visibility push(hidden)
diff --git a/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C b/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C
index a4bb42c728a..fe6c47fdbf5 100644
--- a/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C
+++ b/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C
@@ -1,6 +1,6 @@
/* Test that #pragma GCC visibility does not override class member specific settings. */
/* { dg-do compile } */
-/* { dg-require-visibility "" } */
+/* { dg-require-visibility "internal" } */
/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */
#pragma GCC visibility push(hidden)
diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C
index dbd7010d028..ae4589397b6 100644
--- a/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C
+++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C
@@ -1,5 +1,5 @@
/* Test warning from conflicting visibility specifications. */
-/* { dg-require-visibility "" } */
+/* { dg-require-visibility "protected" } */
/* { dg-final { scan-hidden "xyzzy" } } */
extern int
diff --git a/gcc/testsuite/g++.dg/ext/weak2.C b/gcc/testsuite/g++.dg/ext/weak2.C
new file mode 100644
index 00000000000..1bf2ddcb4d6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/weak2.C
@@ -0,0 +1,17 @@
+// Test for #pragma weak with declaration not at file scope.
+// { dg-do compile }
+// { dg-require-weak "" }
+// { dg-options "" }
+
+// { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?_Z3foov" } }
+
+#pragma weak _Z3foov
+
+int
+main (void)
+{
+ extern int foo (void);
+ if (&foo)
+ return foo ();
+ return 0;
+}