diff options
author | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
---|---|---|
committer | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
commit | 554fd8c5195424bdbcabf5de30fdc183aba391bd (patch) | |
tree | 976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/g++.dg/parse | |
download | cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2 cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz |
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig;
imported gcc-4.6.4 source tree from verified upstream tarball.
downloading a git-generated archive based on the 'upstream' tag
should provide you with a source tree that is binary identical
to the one extracted from the above tarball.
if you have obtained the source via the command 'git clone',
however, do note that line-endings of files in your working
directory might differ from line-endings of the respective
files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/g++.dg/parse')
418 files changed, 5576 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/parse/access1.C b/gcc/testsuite/g++.dg/parse/access1.C new file mode 100644 index 000000000..f8994e39e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access1.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Origin: Volker Lukas <vlukas@gmx.de> + +// PR c++/9554: Access checking for template ID as class head. + +class enclose +{ + template<typename T> struct enclosed; +}; + +template <> +struct enclose::enclosed<int>; diff --git a/gcc/testsuite/g++.dg/parse/access10.C b/gcc/testsuite/g++.dg/parse/access10.C new file mode 100644 index 000000000..62adc1b16 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access10.C @@ -0,0 +1,11 @@ +// PR c++/18698 +// The compiler was giving an error message for invalid syntax +// that irrelevantly talked about using-declarations. + +template<int> struct A +{ + ::A~(); // { dg-bogus "using-declaration" } +}; + +// Instead of the bogus error we get a different error. +// { dg-error "template-name" "" { target *-*-* } 7 } diff --git a/gcc/testsuite/g++.dg/parse/access2.C b/gcc/testsuite/g++.dg/parse/access2.C new file mode 100644 index 000000000..ee8cd234e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access2.C @@ -0,0 +1,15 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// Deferred access checking of variable declaration. + +class A { + typedef int X; // { dg-error "private" } + static X a, b, c; +}; + +A::X A::a; +A::X A::b, x; // { dg-error "this context" } +A::X y, A::c; // { dg-error "this context" } +A::X z; // { dg-error "this context" } diff --git a/gcc/testsuite/g++.dg/parse/access3.C b/gcc/testsuite/g++.dg/parse/access3.C new file mode 100644 index 000000000..43303c95a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access3.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Origin: <bagnara@cs.unipr.it> + +// PR c++/7809: Befriending inaccessible name. + +class A { +private: + void f(); // { dg-error "private" } +}; + +class B { + friend void A::f(); // { dg-error "context" } +}; diff --git a/gcc/testsuite/g++.dg/parse/access4.C b/gcc/testsuite/g++.dg/parse/access4.C new file mode 100644 index 000000000..d3870bd34 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access4.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Origin: Mike Reed <mike.reed@amadron.com> + +// PR c++/11174: Access checking of pointer-to-member function + +class A { +protected: + void foo() {} // { dg-error "protected" } +public: + A(); +}; + +class B : public A { + void bar() { + A a; + void (A::*pmf)() = &A::foo; // { dg-error "this context" } + (a.*pmf)(); + } +}; diff --git a/gcc/testsuite/g++.dg/parse/access5.C b/gcc/testsuite/g++.dg/parse/access5.C new file mode 100644 index 000000000..cd1789eed --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access5.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/11174: Access checking on pointer to member data. + +struct A +{ +protected: + int a; // { dg-error "protected" } +}; + +struct B : A +{ + void foo() { + (void)&A::a; // { dg-error "this context" } + } +}; diff --git a/gcc/testsuite/g++.dg/parse/access6.C b/gcc/testsuite/g++.dg/parse/access6.C new file mode 100644 index 000000000..33d509058 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access6.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Origin: David Baron <dbaron@fas.harvard.edu> + +// PR c++/3765: Changing access from public to private by member +// using declaration. + +class A +{ + public: + int foo() { return 1; } // { dg-error "inaccessible" } +}; + +class B : public A +{ + private: + using A::foo; +}; + +int main() +{ + B b; + return b.foo(); // { dg-error "this context" } +} diff --git a/gcc/testsuite/g++.dg/parse/access7.C b/gcc/testsuite/g++.dg/parse/access7.C new file mode 100644 index 000000000..2a7ca3c42 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access7.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Origin: Paolo Carlini <pcarlini@unitus.it> + +// PR c++/5655: Access of member redeclaration. + +struct S { + class A; + template <class T> class B; +private: + class A {}; // { dg-error "different access" } + template <class T> class B {}; // { dg-error "different access" } +}; diff --git a/gcc/testsuite/g++.dg/parse/access8.C b/gcc/testsuite/g++.dg/parse/access8.C new file mode 100644 index 000000000..45f4be702 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access8.C @@ -0,0 +1,12 @@ +// PR c++/22618 + +class foo +{ + typedef int memfun; // { dg-error "private" } +}; + +template<foo::memfun> +struct fm_obj { }; // { dg-error "context" } + +template <typename T = foo::memfun> // { dg-error "context" } +struct S {}; diff --git a/gcc/testsuite/g++.dg/parse/access9.C b/gcc/testsuite/g++.dg/parse/access9.C new file mode 100644 index 000000000..2c29016b0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access9.C @@ -0,0 +1,5 @@ +// PR c++/24782 + +class Foo { public: typedef int type1; }; +class Bar { private: typedef Foo type2; }; // { dg-error "private" } +void g(Bar::type2::type1) {} // { dg-error "context" } diff --git a/gcc/testsuite/g++.dg/parse/ambig1.C b/gcc/testsuite/g++.dg/parse/ambig1.C new file mode 100644 index 000000000..2645879b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig1.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Jan 2003 <nathan@codesourcery.com> + +// PR 9109. Ambiguity. [dcl.ambig.res]/7 + +template <typename T> void Foo (int (T)) +{ + try {} + catch (int (T)) {} +} diff --git a/gcc/testsuite/g++.dg/parse/ambig2.C b/gcc/testsuite/g++.dg/parse/ambig2.C new file mode 100644 index 000000000..7b000c620 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig2.C @@ -0,0 +1,27 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 6 Jan 2003 <nathan@codesourcery.com> + +// PR 9212. We erroneously accepted an ill-formed +// function-declaration, rather than a variable initializer. + + +struct A +{ + enum E { e }; + A(E); +}; + +struct B +{ + enum F { f }; + B(F); +}; + +struct C +{ + C(A, B, A); +}; + +C c(A(A::e), B(B::f), A(A::e)); // This is not a function declaration diff --git a/gcc/testsuite/g++.dg/parse/ambig3.C b/gcc/testsuite/g++.dg/parse/ambig3.C new file mode 100644 index 000000000..41390710f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig3.C @@ -0,0 +1,21 @@ +// PR c++/9452 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <int> struct A { static const int i = 1; }; +template <int> struct B {}; + +template <typename> int foo(B<0>) +{ + return 0; +} + +template <typename, int j> B<A<j>::i-1> foo(B<j>) +{ + return B<0>(); +} + +int main() +{ + return foo<int>(B<0>()); +} diff --git a/gcc/testsuite/g++.dg/parse/ambig4.C b/gcc/testsuite/g++.dg/parse/ambig4.C new file mode 100644 index 000000000..868f07cf7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig4.C @@ -0,0 +1,18 @@ +// PR c++/20293 + +namespace hide { // { dg-error "hide" } + int k; +} + +namespace { + int i; + namespace hide { // { dg-error "hide" } + int j; + } +} + +void F(int) {} + +int main() { + F(hide::j); // { dg-error "ambiguous" } +} diff --git a/gcc/testsuite/g++.dg/parse/ambig5.C b/gcc/testsuite/g++.dg/parse/ambig5.C new file mode 100644 index 000000000..e554d961f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig5.C @@ -0,0 +1,7 @@ +// PR c++/41786 + +struct A { A(int, char const*); }; +int main() { + int i = 0, *b = &i; + A a(int(b[i]), "hello"); +} diff --git a/gcc/testsuite/g++.dg/parse/ambig6.C b/gcc/testsuite/g++.dg/parse/ambig6.C new file mode 100644 index 000000000..8f37feaea --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ambig6.C @@ -0,0 +1,12 @@ +// PR c++/48046 + +namespace N1 { typedef int T; } // { dg-error "" } +namespace N2 { typedef float T; } // { dg-error "" } + +int main() +{ + using namespace N1; + using namespace N2; + + static T t; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/angle-bracket.C b/gcc/testsuite/g++.dg/parse/angle-bracket.C new file mode 100644 index 000000000..39bb4eb10 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/angle-bracket.C @@ -0,0 +1,9 @@ +// Contributed by Gabriel Dos Reis <gdr@codesourcery.com> +// Origin: Bill Somerville <bill@classdesign.com> +// { dg-do compile } + +int main() +{ + ( int() > int() ); + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/angle-bracket2.C b/gcc/testsuite/g++.dg/parse/angle-bracket2.C new file mode 100644 index 000000000..fb758e33f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/angle-bracket2.C @@ -0,0 +1,6 @@ +// { dg-do compile } +// Contributed by MattyT <mattyt-bugzilla at tpg dot com dot au> +// PR c++/14028: Parser accepts invalid unbalanced bracket. + +template <int> struct A {}; +template <typename TP> class B : public A<4 {}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/args1.C b/gcc/testsuite/g++.dg/parse/args1.C new file mode 100644 index 000000000..0eb6e64b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/args1.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 9 Jul 2003 <nathan@codesourcery.com> + +// PR c++ 11050. Accepted ill-formed + + +void Foo (int) +{ + Foo(2 2); // { dg-error "expected" "" } +} diff --git a/gcc/testsuite/g++.dg/parse/array-size1.C b/gcc/testsuite/g++.dg/parse/array-size1.C new file mode 100644 index 000000000..2bc31f758 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/array-size1.C @@ -0,0 +1,13 @@ +// PR c++/38 +// Origin: Wolfgang Bangerth <bangerth@dealii.org> +// { dg-do compile } + +template <int i> struct A +{ + static const int n = 1; + typedef double X[n]; + + A (const X&); +}; + +template <int i> A<i>::A (const X&) {} diff --git a/gcc/testsuite/g++.dg/parse/array-size2.C b/gcc/testsuite/g++.dg/parse/array-size2.C new file mode 100644 index 000000000..355ed6133 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/array-size2.C @@ -0,0 +1,20 @@ +// PR c/25682 +// { dg-do compile } +// Test whether we don't ICE on questionable constructs where offsetof +// should have been used instead. + +struct S +{ + char a[4]; + int b; +}; + +extern void bar (char *, char *); + +void +foo (void) +{ + char g[(char *) &((struct S *) 0)->b - (char *) 0]; + char h[(__SIZE_TYPE__) &((struct S *) 8)->b]; + bar (g, h); +} diff --git a/gcc/testsuite/g++.dg/parse/asm1.C b/gcc/testsuite/g++.dg/parse/asm1.C new file mode 100644 index 000000000..009ffbd3a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/asm1.C @@ -0,0 +1,6 @@ +//PR c++/30849 + +void foo() +{ + asm("" : 0); // { dg-error "numeric constant|token" } +} diff --git a/gcc/testsuite/g++.dg/parse/asm2.C b/gcc/testsuite/g++.dg/parse/asm2.C new file mode 100644 index 000000000..09924c9c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/asm2.C @@ -0,0 +1,6 @@ +//PR c++/30850 + +void foo() +{ + asm("" :: 0); // { dg-error "numeric constant|token" } +} diff --git a/gcc/testsuite/g++.dg/parse/asm3.C b/gcc/testsuite/g++.dg/parse/asm3.C new file mode 100644 index 000000000..91f19e48c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/asm3.C @@ -0,0 +1,6 @@ +//PR c++/30851 + +void foo() +{ + asm ("%[x]" : [0](x)); // { dg-error "numeric constant|token" } +} diff --git a/gcc/testsuite/g++.dg/parse/attr-ctor1.C b/gcc/testsuite/g++.dg/parse/attr-ctor1.C new file mode 100644 index 000000000..23d488a20 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr-ctor1.C @@ -0,0 +1,9 @@ +// PR c++/6992 +// Origin: <petr@scssoft.com> +// { dg-do compile } +// { dg-require-named-sections "" } + +class A +{ + __attribute__((section("whatever"))) A(); +}; diff --git a/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C b/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C new file mode 100644 index 000000000..845d873aa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr-externally-visible-1.C @@ -0,0 +1,49 @@ +// { dg-do compile } +// { dg-options "-O3 -fwhole-program" } +// { dg-add-options bind_pic_locally } +// { dg-final { scan-assembler "foo1" } } +// { dg-final { scan-assembler "foo2" } } +// { dg-final { scan-assembler "foo3" } } +// { dg-final { scan-assembler "foo4" } } +// { dg-final { scan-assembler "foo5" } } +// { dg-final { scan-assembler-not "foo6" } } +// { dg-final { scan-assembler "bar1" } } +// { dg-final { scan-assembler "bar2" } } +// { dg-final { scan-assembler "bar3" } } +// { dg-final { scan-assembler "bar4" } } +// { dg-final { scan-assembler "bar5" } } +// { dg-final { scan-assembler-not "bar6" } } + +extern void foo1 (void) __attribute__((externally_visible)); +void foo1 (void) { } + +extern void foo2 (void) __attribute__((externally_visible)); +__attribute__((externally_visible)) void foo2 (void) { } + +extern void foo3 (void); +__attribute__((externally_visible)) void foo3 (void) { } + +__attribute__((externally_visible)) void foo4 (void) { } + +void foo5 (void) { } +extern void foo5 (void) __attribute__((externally_visible)); + +void foo6 (void) { } + +extern char *bar1 __attribute__((externally_visible)); +char *bar1; + +extern char *bar2 __attribute__((externally_visible)); +char *bar2 __attribute__((externally_visible)); + +extern char *bar3; +char *bar3 __attribute__((externally_visible)); + +char *bar4 __attribute__((externally_visible)); + +char *bar5; +extern char *bar5 __attribute__((externally_visible)); + +char *bar6; + +int main (void) { } diff --git a/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C b/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C new file mode 100644 index 000000000..d7feaabb2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr-externally-visible-2.C @@ -0,0 +1,38 @@ +// { dg-do compile } +// { dg-options "-O -fwhole-program" } + +static void foo1 (void) { } // { dg-warning "have effect only on public" } +extern void foo1 (void) __attribute__((externally_visible)); + +struct C +{ + __attribute__((externally_visible)) void foo3 (void) { } +}; + +__attribute__((externally_visible)) static void foo3 (void) { } // { dg-warning "have effect only on public" } + +static int bar1; +extern int bar1 __attribute__((externally_visible)); // { dg-warning "have effect only on public" } + +static int bar2 __attribute__((externally_visible)); // { dg-warning "have effect only on public" } + +void fn1 (void) +{ + static int bar3 __attribute__((externally_visible)); // { dg-warning "have effect only on public" } +} + +void fn2 (void) +{ + int bar4 __attribute__((externally_visible)); // { dg-warning "have effect only on public" } +} + +struct A +{ +} __attribute__((externally_visible)); // { dg-warning "does not apply to types" } + +typedef int B __attribute__((externally_visible)); // { dg-warning "attribute ignored" } + +struct D +{ + static int d __attribute__((externally_visible)); +}; diff --git a/gcc/testsuite/g++.dg/parse/attr1.C b/gcc/testsuite/g++.dg/parse/attr1.C new file mode 100644 index 000000000..10d6f57d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr1.C @@ -0,0 +1,50 @@ +// Test whether attributes are accepted both immediately after +// struct/union keyword and after the closing brace. +// { dg-do compile } + +struct foo +{ + union __attribute__ ((packed)) + { + int a; + long b; + }; + union __attribute__ ((packed)) __attribute__ ((unused)) + { + int c; + long d; + }; +}; + +union __attribute__ ((packed)) bar +{ + int c; + long d; +}; + +struct __attribute__ ((packed)) baz +{ + int e; + long f; +}; + +struct foo2 +{ + union + { + int a; + long b; + } __attribute__ ((packed)); +}; + +union bar2 +{ + int c; + long d; +} __attribute__ ((packed)); + +struct baz2 +{ + int e; + long f; +} __attribute__ ((packed)); diff --git a/gcc/testsuite/g++.dg/parse/attr2.C b/gcc/testsuite/g++.dg/parse/attr2.C new file mode 100644 index 000000000..ce770029c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr2.C @@ -0,0 +1,12 @@ +// PR c++/16337 + +#define vector __attribute__((vector_size(16))) +void foo (void) +{ + vector signed int v1 = { 1, 2, 3, 4 }; + vector signed int v2, v3; + vector signed int v4; + v2 = v1; + v3 = v1; + v4 = v1; +} diff --git a/gcc/testsuite/g++.dg/parse/attr3.C b/gcc/testsuite/g++.dg/parse/attr3.C new file mode 100644 index 000000000..848df055c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/attr3.C @@ -0,0 +1,14 @@ +// PR c++/39219 + +enum __attribute__ ((deprecated)) E { e }; +struct S { enum __attribute__ ((deprecated)) F { f = e }; }; + +int main () { + E x; // { dg-warning "'E' is deprecated" "" } + x = e; + + S::F y; // { dg-warning "'F' is deprecated" "" } + y = S::f; + + return x + y; +} diff --git a/gcc/testsuite/g++.dg/parse/bitfield1.C b/gcc/testsuite/g++.dg/parse/bitfield1.C new file mode 100644 index 000000000..2e0760585 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/bitfield1.C @@ -0,0 +1,11 @@ +// PR c++/27803 + +struct A +{ + double i : 8; // { dg-error "type" } +}; + +void foo(A& a) +{ + (char)a.i; // { dg-error "no member" } +} diff --git a/gcc/testsuite/g++.dg/parse/bitfield2.C b/gcc/testsuite/g++.dg/parse/bitfield2.C new file mode 100644 index 000000000..a04d2adf8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/bitfield2.C @@ -0,0 +1,34 @@ +//PR c++/28053 + +struct X {}; + +struct A +{ + X x : 2; // { dg-error "non-integral type" } +}; +struct B : A {}; + +template <typename T> +struct C +{ + T t : 3; +}; + +C<int> c; + +template <typename T> +struct D +{ + T t : 3; // { dg-error "non-integral type" } +}; + +D<double> d; // { dg-message "instantiated" } + +template <typename T> +struct E +{ + typedef T* U; + U t : 3; // { dg-error "non-integral type" } +}; + +E<double> e; diff --git a/gcc/testsuite/g++.dg/parse/bitfield3.C b/gcc/testsuite/g++.dg/parse/bitfield3.C new file mode 100644 index 000000000..387548a68 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/bitfield3.C @@ -0,0 +1,9 @@ +/* PR c++/35320 */ +/* { dg-do compile } */ + +typedef void (func_type)(); + +struct A +{ + friend func_type f : 2; /* { dg-error "with non-integral type" } */ +}; diff --git a/gcc/testsuite/g++.dg/parse/break-in-for.C b/gcc/testsuite/g++.dg/parse/break-in-for.C new file mode 100644 index 000000000..3028cdc80 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/break-in-for.C @@ -0,0 +1,12 @@ +/* PR17412 - ICE in fold_const.c during parsing. + fold would try to fold the operands of the break statement. */ +/* { dg-do compile } */ +/* { dg-options "" } */ + + +void foo () +{ + for (;;) + for (;;({break;})); +} + diff --git a/gcc/testsuite/g++.dg/parse/builtin1.C b/gcc/testsuite/g++.dg/parse/builtin1.C new file mode 100644 index 000000000..3b826bd86 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/builtin1.C @@ -0,0 +1,16 @@ +namespace std { +class Base {}; +} + +struct Derived : public std::Base { + operator const char*() const; + operator bool(void) const; +}; + +void log(const char* str); + +void nothing() +{ + Derived temp; + log(temp); +} diff --git a/gcc/testsuite/g++.dg/parse/builtin2.C b/gcc/testsuite/g++.dg/parse/builtin2.C new file mode 100644 index 000000000..c524ea684 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/builtin2.C @@ -0,0 +1,5 @@ +// PR c++/14432 +// { dg-options "" } + +struct Y {}; +Y y1; diff --git a/gcc/testsuite/g++.dg/parse/cast1.C b/gcc/testsuite/g++.dg/parse/cast1.C new file mode 100644 index 000000000..c8dbed1ac --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cast1.C @@ -0,0 +1,11 @@ +// PR c++/13536 +// { dg-require-effective-target ilp32 } */ +// { dg-options "-w" } + +#include <typeinfo> + +void f() { + (int((char*)0)); + sizeof ((int((char*)0))); + typeid ((int((char*)0))); +} diff --git a/gcc/testsuite/g++.dg/parse/cast2.C b/gcc/testsuite/g++.dg/parse/cast2.C new file mode 100644 index 000000000..d447bb4ba --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cast2.C @@ -0,0 +1,13 @@ +// PR c++/13736 + +struct string +{ + string() {} + string(const string&) {} + string(const char*) {} +}; + +int main() +{ + string s2(string( (const char*)(""))); +} diff --git a/gcc/testsuite/g++.dg/parse/casting-operator1.C b/gcc/testsuite/g++.dg/parse/casting-operator1.C new file mode 100644 index 000000000..867221a35 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/casting-operator1.C @@ -0,0 +1,11 @@ +// PR c++/8578 +// Origin: <Delana.Lorenzo@libero.it> +// { dg-do compile } + +template <typename T> struct A +{ + typedef typename T::X X; + operator X(); +}; + +template <typename T> A<T>::operator typename A<T>::X () {} diff --git a/gcc/testsuite/g++.dg/parse/casting-operator2.C b/gcc/testsuite/g++.dg/parse/casting-operator2.C new file mode 100644 index 000000000..008fa62dc --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/casting-operator2.C @@ -0,0 +1,27 @@ +// { dg-do compile } +// Contributed by Martin Loewis <loewis at informatik dot hu-berlin dot de> +// PR c++/8856: Make sure template conversion operators are not parsed as +// template names. + +struct K {}; +template <bool> struct K2 {}; + +template <class T> struct A { + template <class U> operator U() { return U(); } +}; + +int main() { + A<double> a; + + (void)a.operator int(); + (void)a.operator double(); + (void)a.operator K2<true>(); + (void)a.A<double>::operator int(); + (void)a.A<double>::operator double(); + (void)a.A<double>::operator K2<true>(); + + (void)a.operator double<int>(); // { dg-error "not a template" } + (void)a.operator K<int>(); // { dg-error "not a template" } + (void)a.A<double>::operator double<int>(); // { dg-error "not a template" } + (void)a.A<double>::operator K<int>(); // { dg-error "not a template" } +} diff --git a/gcc/testsuite/g++.dg/parse/catch1.C b/gcc/testsuite/g++.dg/parse/catch1.C new file mode 100644 index 000000000..877402231 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/catch1.C @@ -0,0 +1,8 @@ +// PR c++/28249 +// { dg-do compile } + +void foo() +{ + try {} + catch (long long long) {} // { dg-error "long long long" } +} diff --git a/gcc/testsuite/g++.dg/parse/class1.C b/gcc/testsuite/g++.dg/parse/class1.C new file mode 100644 index 000000000..819c48d9c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/class1.C @@ -0,0 +1,10 @@ +namespace N +{ + struct A; + int f() { + struct N::A { // { dg-error "" } + A() {} + }; + return 0; + } +} diff --git a/gcc/testsuite/g++.dg/parse/class2.C b/gcc/testsuite/g++.dg/parse/class2.C new file mode 100644 index 000000000..2014f9b50 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/class2.C @@ -0,0 +1,14 @@ +// PR c++/13140 + +struct foo { + foo(); + void f(); + static int i; +}; + + +namespace bar { + foo::foo() {} // { dg-error "namespace" } + void foo::f() {} // { dg-error "namespace" } + int foo::i; // { dg-error "namespace" } +} diff --git a/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C b/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C new file mode 100644 index 000000000..8e25fbac2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/colon-autocorrect-1.C @@ -0,0 +1,31 @@ +// PR c++/44522 +// { dg-do compile } + +namespace x { + struct a { }; + a A0; +} + +x:a a2; // { dg-error "nested-name-specifier" } +x::a a3 = a2; + +x:a f (void) // { dg-error "nested-name-specifier" } +{ + x::a a4; // x:a would parse like a label + return a4; +} + +x::a g (x:a a4) // { dg-error "nested-name-specifier" } +{ + return a4; +} + +class B +{ + x::a f(void) // x:a would parse like a bitfield + { + x::a a4; + a4 = x:A0; // { dg-error "nested-name-specifier" } + return a4; + } +}; diff --git a/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C b/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C new file mode 100644 index 000000000..1dfcbc068 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/colon-autocorrect-2.C @@ -0,0 +1,15 @@ +// PR c++/44523 +// { dg-do compile } + +namespace x { + struct a { }; +} + +template <typename t> +class foo { +}; + +foo<x::a> a1; +foo<x:a> a2; // { dg-error "nested-name-specifier" } + +x::a a3 = a2; // { dg-error "conversion" } diff --git a/gcc/testsuite/g++.dg/parse/comma1.C b/gcc/testsuite/g++.dg/parse/comma1.C new file mode 100644 index 000000000..4983535a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/comma1.C @@ -0,0 +1,14 @@ +// PR c++/14278 +// { dg-options "" } + +struct X { + X (int p); +}; + +struct A { + A(X); +}; + +void *p_fun; + +A a(X ((*(int (*)(int, int)) p_fun)(0, 0))); diff --git a/gcc/testsuite/g++.dg/parse/comma2.C b/gcc/testsuite/g++.dg/parse/comma2.C new file mode 100644 index 000000000..0f405876d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/comma2.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Copyright (C) 2005 Free Software Foundation, Inc. + +// PR c++/24907 [3.4/4.0/4.1/4.2 Regression] "int x, ;" accepted + +int x; +int y,; /* { dg-error "expected" } */ + +int main() +{ + int a; + int b,; /* { dg-error "expected" } */ + int c,d; + int e,f,; /* { dg-error "expected" } */ + int g,h,i; + int j,k,l,;/* { dg-error "expected" } */ + int m,,,n; /* { dg-error "expected" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/concat1.C b/gcc/testsuite/g++.dg/parse/concat1.C new file mode 100644 index 000000000..7bf97a628 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/concat1.C @@ -0,0 +1,15 @@ +/* PR c/3581 */ +/* { dg-do compile } */ + +/* Intended as a compile-time test for string literal concatenation. + The fact that the string isn't actually used in the resulting program + should allow this to compile for any target. */ + +#define e0 "a" +#define e1 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0 +#define e2 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1 +#define e3 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2 +#define e4 e3 e3 e3 e3 e3 e3 e3 e3 e3 e3 +#define e5 e4 e4 e4 e4 e4 e4 e4 e4 e4 e4 + +void foo() { (void)(e5); } diff --git a/gcc/testsuite/g++.dg/parse/cond1.C b/gcc/testsuite/g++.dg/parse/cond1.C new file mode 100644 index 000000000..699477305 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cond1.C @@ -0,0 +1,6 @@ +// PR c++/18389 + +void foo() +{ + for (; struct A {}; ); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/cond2.C b/gcc/testsuite/g++.dg/parse/cond2.C new file mode 100644 index 000000000..2dbe42b34 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cond2.C @@ -0,0 +1,14 @@ +// PR c++/20905 + +struct name {}; + +int +f (); + +void +g () +{ + if (int name = f ()) + { + } +} diff --git a/gcc/testsuite/g++.dg/parse/cond3.C b/gcc/testsuite/g++.dg/parse/cond3.C new file mode 100644 index 000000000..96d9c1e3b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cond3.C @@ -0,0 +1,15 @@ +// PR c++/30847 +// { dg-do compile } +// { dg-options "" } + +int j, k, l; +extern void baz (); + +void +foo (int i) +{ + (i ? j : k) = ({ l++; (void) l; }); // { dg-error "void value not ignored" } + (i ? j : k) += ({ l++; (void) l; }); // { dg-error "void value not ignored" } + (i ? j : k) = baz (); // { dg-error "void value not ignored" } + (i ? j : k) *= baz (); // { dg-error "void value not ignored" } +} diff --git a/gcc/testsuite/g++.dg/parse/cond4.C b/gcc/testsuite/g++.dg/parse/cond4.C new file mode 100644 index 000000000..ae210e0d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cond4.C @@ -0,0 +1,6 @@ +// PR c++/38635 +// { dg-do compile } + +void foo() +{ + if (struct A{}// { dg-error "types may not be defined|expected" } diff --git a/gcc/testsuite/g++.dg/parse/cond5.C b/gcc/testsuite/g++.dg/parse/cond5.C new file mode 100644 index 000000000..7ed9fbe89 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/cond5.C @@ -0,0 +1,10 @@ +// PR c++/40566 + +void +f (int x, int y) +{ + int c = x ? 23 : throw "bla"; + short d = y ? throw "bla" : 23; + char e = x ? 23 : throw "bla"; + long f = x ? 23 : throw "bla"; +} diff --git a/gcc/testsuite/g++.dg/parse/condexpr1.C b/gcc/testsuite/g++.dg/parse/condexpr1.C new file mode 100644 index 000000000..1ca7dbfa6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/condexpr1.C @@ -0,0 +1,13 @@ +// PR c++/10247 +// Origin: Lars Gullik Bjønes <larsbj@lyx.org> +// { dg-do compile } + +struct A {}; + +A const foo(); + +void bar() +{ + A a = foo(); + A b = true ? a : foo(); +} diff --git a/gcc/testsuite/g++.dg/parse/constant1.C b/gcc/testsuite/g++.dg/parse/constant1.C new file mode 100644 index 000000000..c8a948a57 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant1.C @@ -0,0 +1,15 @@ +// { dg-options -std=c++98 } + +void f () { + switch (0) { + case (3, 0): // { dg-error "" } + break; + } +} + +int g (); + +struct S { + int i : (false ? g () : 1); // { dg-error "" } +}; + diff --git a/gcc/testsuite/g++.dg/parse/constant2.C b/gcc/testsuite/g++.dg/parse/constant2.C new file mode 100644 index 000000000..43fad2e28 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant2.C @@ -0,0 +1,28 @@ +// { dg-do compile } +// Origin: <gawrilow at math dot tu-berlin dot de> +// PR c++/10750: error when using a static const member initialized +// with a dependent expression as constant-expression + +struct A +{ + enum { a = 42 }; +}; + +template <class Q> +struct B +{ + static const int b = Q::a; +}; + +template <typename T, template <typename> class P> +struct C +{ + static const bool a = T::a; + static const bool a_ = a; + static const bool b = P<T>::b; + static const bool b_ = b; + static const int c = sizeof(T); + static const int c_ = c; +}; + +template struct C<A,B>; diff --git a/gcc/testsuite/g++.dg/parse/constant3.C b/gcc/testsuite/g++.dg/parse/constant3.C new file mode 100644 index 000000000..c029e33ed --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant3.C @@ -0,0 +1,7 @@ +const int i = 1; +const int j (2); +const int k = { 3 }; + +enum { a = i, b = j, c = k }; + + diff --git a/gcc/testsuite/g++.dg/parse/constant4.C b/gcc/testsuite/g++.dg/parse/constant4.C new file mode 100644 index 000000000..a1be5dd02 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant4.C @@ -0,0 +1,40 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Jul 2003 <nathan@codesourcery.com> + +// PR c++/11525 incorrect error about non-constant initalizer + +template<typename> class X; +template<unsigned> class Y {}; + + +template<typename T> +void Foo () +{ + static const unsigned I = X<T>::I; + + Y<I> i; + + static const unsigned J = X<T>::J; // { dg-message "not initialized with a constant expression" } + + Y<J> j; // { dg-error "constant|template argument" "" } +} + +struct A +{ + operator unsigned () const; +}; + +template <typename> struct X +{ + enum {I}; + static A const J; +}; + +void Baz () +{ + Foo<int> (); // { dg-message "instantiated" "" } +} + + diff --git a/gcc/testsuite/g++.dg/parse/constant5.C b/gcc/testsuite/g++.dg/parse/constant5.C new file mode 100644 index 000000000..f868108a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant5.C @@ -0,0 +1,16 @@ +// { dg-options "-std=c++98 -pedantic-errors" } + +enum E { + a = 24.2, // { dg-error "constant" } + b = (int)3.7, + c = int(4.2), + d = (int)(4.2 + 3.7), // { dg-error "constant" } + e = int(4.2 - 3.7), // { dg-error "constant" } + f = (int)17.25 +}; + +struct S { + static const int i = (int)4.2; + int j[(int)4.2]; + static const int k = static_cast<short>(3.7); +}; diff --git a/gcc/testsuite/g++.dg/parse/constant6.C b/gcc/testsuite/g++.dg/parse/constant6.C new file mode 100644 index 000000000..dae01d47b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant6.C @@ -0,0 +1,23 @@ +// PR c++/19883 + +template<typename T> struct A +{ + static const T i = 1; + char a[int(i)]; +}; + +template<int> struct B {}; + +template<typename T> struct C +{ + static const T i = 2; + B<int(i)> a; +}; + +template< typename T, T N > +struct integral_c +{ + static const T value = N; + + typedef integral_c< T, static_cast<T>((value + 1)) > next; +}; diff --git a/gcc/testsuite/g++.dg/parse/constant7.C b/gcc/testsuite/g++.dg/parse/constant7.C new file mode 100644 index 000000000..c54ad55c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant7.C @@ -0,0 +1,9 @@ +// PR c++/19991 + +enum { e = 1 }; + +template<typename> struct A +{ + static const int i = e; + char a[i]; +}; diff --git a/gcc/testsuite/g++.dg/parse/constructor1.C b/gcc/testsuite/g++.dg/parse/constructor1.C new file mode 100644 index 000000000..1bb9ee0a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constructor1.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// { dg-options "-fshow-column" } + +ACE_Process_Descriptor::ACE_Process_Descriptor () : + // { dg-error "does not name a type" "no type" { target *-*-* } 4 } + process_ (0) +{ +} diff --git a/gcc/testsuite/g++.dg/parse/constructor2.C b/gcc/testsuite/g++.dg/parse/constructor2.C new file mode 100644 index 000000000..e514e9397 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constructor2.C @@ -0,0 +1,11 @@ +// PR c++/14260 + +template <class TClass> +class T +{ +public: + T(short,short f=0) {} + T<TClass>(int f) {} + T<TClass>(int f=0,const char* b=0) {} +}; + diff --git a/gcc/testsuite/g++.dg/parse/constructor3.C b/gcc/testsuite/g++.dg/parse/constructor3.C new file mode 100644 index 000000000..fe741c833 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constructor3.C @@ -0,0 +1,14 @@ +/* PR c++/29077 */ +/* { dg-do compile } */ + +class c { + c(); + c(const c&); + ~c(); +}; + +namespace m { + c::c() {} /* { dg-error "c::c" } */ + c::c(const c&) {} /* { dg-error "c::c" } */ + c::~c() {} /* { dg-error "c::~c" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/conv_op1.C b/gcc/testsuite/g++.dg/parse/conv_op1.C new file mode 100644 index 000000000..e892f01aa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/conv_op1.C @@ -0,0 +1,30 @@ + +// { dg-do compile } + +// Copyright (C) 2002 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 21 Dec 2002 <nathan@codesourcery.com> + +// PR 8572. ICE with templated conversion operators. + +template <typename T> struct A +{ + struct B { }; + operator B* () const; + B *Foo (); +}; + +template <typename T> typename A<T>::B *A<T>::Foo () +{ + return 0; +} + +template <typename T> A<T>::operator typename A<T>::B* () const +{ + return 0; +} + +void Foo (A<int> &p) +{ + p.Foo (); + static_cast <A<int>::B *> (p); +} diff --git a/gcc/testsuite/g++.dg/parse/crash1.C b/gcc/testsuite/g++.dg/parse/crash1.C new file mode 100644 index 000000000..750ed18e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash1.C @@ -0,0 +1 @@ +struct s { s(std::b o) { } }; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/crash10.C b/gcc/testsuite/g++.dg/parse/crash10.C new file mode 100644 index 000000000..712e87674 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash10.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 22 Jul 2003 <nathan@codesourcery.com> + +// PR c++ 10953. ICE + +// { dg-bogus "" "" { target *-*-* } 14 } + +class +{ + typename:: +; // { dg-error "" "" } diff --git a/gcc/testsuite/g++.dg/parse/crash11.C b/gcc/testsuite/g++.dg/parse/crash11.C new file mode 100644 index 000000000..eb5cf3c24 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash11.C @@ -0,0 +1,34 @@ +// { dg-do compile } + +// Origin: priesnit@math.uni-goettingen.de + +// PR c++/5767: ICE parsing typename with invalid scope. + +template <template <typename> class TP> +struct A +{ + template <typename T> + struct Template + { + typedef typename TP<T>::Type Type; + }; +}; +template <template <typename> class TP> +struct B +{ + template <typename T> + struct Template + { + typedef typename A<A<TP>::Template> // { dg-error "mismatch|class template" } + ::template Template<T>::Type Type; // { dg-error "" } + }; +}; +template <typename T> +struct C +{ + typedef void Type; +}; +int main() +{ + typedef B<C>::Template<void>::Type Type; // { dg-error "does not name a type" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash12.C b/gcc/testsuite/g++.dg/parse/crash12.C new file mode 100644 index 000000000..769ca2e93 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash12.C @@ -0,0 +1,24 @@ +// { dg-do compile } + +// Origin: Martin von Loewis <martin@v.loewis.de> + +// PR c++/157: Incorrect type/template decision in function parameter. + +template <class _Tp> class auto_ptr {}; +template <class _Tp> +class counted_ptr +{ +public: + counted_ptr(::auto_ptr<_Tp>& __a); // { dg-error "candidate" } + ::auto_ptr<_Tp> auto_ptr(); +}; + +template <class _Tp> +inline counted_ptr<_Tp>::counted_ptr(class auto_ptr& __a) // { dg-error "required|not match|template" } +{ +} + +template <class _Tp> +inline class auto_ptr<_Tp> counted_ptr<_Tp>::auto_ptr() +{ +} diff --git a/gcc/testsuite/g++.dg/parse/crash13.C b/gcc/testsuite/g++.dg/parse/crash13.C new file mode 100644 index 000000000..3c298ec8e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash13.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/10583: ICE using template function with invalid signature. + +template <typename> +struct A +{ + struct B + {}; +}; + +template <typename T> +void func(A<T>::B* ) // { dg-error "variable|template|expression" } +{ +} + +int main() +{ + func<void>(0); // { dg-error "not declared|expression|;" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash14.C b/gcc/testsuite/g++.dg/parse/crash14.C new file mode 100644 index 000000000..b4cf49a99 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash14.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// Contributed by: Giovanni Bajo <giovannibajo at libero dot it> +// PR c++/14448: Fold constant initializers in templates + +template <int> struct A +{ + A(); +}; + + +template<typename T> void foo(T) +{ + static const int n=1+1; + A<n+1> a; +} + +void bar() +{ + foo(0); +} diff --git a/gcc/testsuite/g++.dg/parse/crash15.C b/gcc/testsuite/g++.dg/parse/crash15.C new file mode 100644 index 000000000..afad4c1fe --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash15.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 29 Jun 2004 <nathan@codesourcery.com> + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> +// Bug 16260. ICE + +template<typename T> int foo() { return T::X::Y; } diff --git a/gcc/testsuite/g++.dg/parse/crash16.C b/gcc/testsuite/g++.dg/parse/crash16.C new file mode 100644 index 000000000..dc8f7a608 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash16.C @@ -0,0 +1,8 @@ +// PR c++/16971 + +namespace N { + int i; // { dg-error "" } + // By checking for an explicit keyword on the next line we avoid + // matching an ICE message. + int i; // { dg-error "redefinition" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash17.C b/gcc/testsuite/g++.dg/parse/crash17.C new file mode 100644 index 000000000..e50f07af4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash17.C @@ -0,0 +1,9 @@ +// PR c++/16716 + +template <typename> class allocator; + +template<typename T> class vector { + // With the dg-error on the next line, we are really just trying to + // check that the message is not an ICE message. + typedef typename allocator<T> allocator_type; // { dg-error "expected|invalid" } +}; diff --git a/gcc/testsuite/g++.dg/parse/crash18.C b/gcc/testsuite/g++.dg/parse/crash18.C new file mode 100644 index 000000000..94be360ab --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash18.C @@ -0,0 +1,7 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com> + +// PR 18095: ICE +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A // { dg-error "expected" "" } diff --git a/gcc/testsuite/g++.dg/parse/crash19.C b/gcc/testsuite/g++.dg/parse/crash19.C new file mode 100644 index 000000000..cc50d9507 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash19.C @@ -0,0 +1,7 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 20 Oct 2004 <nathan@codesourcery.com> + +// PR 18095: ICE +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A {} // { dg-error "expected" "" } diff --git a/gcc/testsuite/g++.dg/parse/crash2.C b/gcc/testsuite/g++.dg/parse/crash2.C new file mode 100644 index 000000000..ccf89ccc8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash2.C @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +int main(void) +{ + char x, y; + if ('A' == x) && ('B' == y)) { } /* { dg-error "" } */ + if (x == 'A') && (y == 'B')) { } /* { dg-error "" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/crash20.C b/gcc/testsuite/g++.dg/parse/crash20.C new file mode 100644 index 000000000..d04869fa7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash20.C @@ -0,0 +1,14 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 1 Dec 2004 <nathan@codesourcery.com> + +// PR 18729: ICE on ill formed +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +template<typename T> struct A +{ + typedef typename T::X Y; // { dg-error "not a class" "" } +}; + +A<int>::Y y; // { dg-message "instantiated from here" "" } diff --git a/gcc/testsuite/g++.dg/parse/crash21.C b/gcc/testsuite/g++.dg/parse/crash21.C new file mode 100644 index 000000000..283f6b4d5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash21.C @@ -0,0 +1,7 @@ +namespace N +{ + struct A; // { dg-error "previous declaration" "" } +} + +template<int I> +struct N::A {}; // { dg-error "redeclared" "" } diff --git a/gcc/testsuite/g++.dg/parse/crash22.C b/gcc/testsuite/g++.dg/parse/crash22.C new file mode 100644 index 000000000..eaf4d1a5c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash22.C @@ -0,0 +1,25 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Jan 2005 <nathan@codesourcery.com> + +// PR 19030: ICE +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A; // { dg-error "A" } + +namespace N +{ + struct A; // { dg-error "A" } +} + +using namespace N; + +int A::i; // { dg-error "ambiguous|declared here" "" } +int A::i; // { dg-error "ambiguous|redefinition of" "" } + +namespace N +{ + struct C; + struct C {}; +} + +class D : N::C {}; diff --git a/gcc/testsuite/g++.dg/parse/crash23.C b/gcc/testsuite/g++.dg/parse/crash23.C new file mode 100644 index 000000000..19ad70a64 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash23.C @@ -0,0 +1,12 @@ +// PR c++/19733 + +struct A {}; +typedef int I; +void foo() { + A().~A; // { dg-error "" } + A().A::~A; // { dg-error "" } + (int().I::~I, 3); // { dg-error "" } + int().I::~I; // { dg-error "" } +} + + diff --git a/gcc/testsuite/g++.dg/parse/crash24.C b/gcc/testsuite/g++.dg/parse/crash24.C new file mode 100644 index 000000000..fdc4f1e7c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash24.C @@ -0,0 +1,6 @@ +// PR c++/20461 +// { dg-do compile } + +class C; // { dg-error "forward declaration" } + +C::C() : f() {} // { dg-error "invalid use|does not have" } diff --git a/gcc/testsuite/g++.dg/parse/crash25.C b/gcc/testsuite/g++.dg/parse/crash25.C new file mode 100644 index 000000000..d7f20c62f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash25.C @@ -0,0 +1,10 @@ +// PR c++/20536 +// Found by Wolfgang Wieser 03/2005. +// { dg-do compile } + +struct yyguts_t +{ + class TestScanner* yyextra_r; // { dg-error "forward declaration" } +}; + +TestScanner::TestScanner() {} // { dg-error "invalid use" } diff --git a/gcc/testsuite/g++.dg/parse/crash26.C b/gcc/testsuite/g++.dg/parse/crash26.C new file mode 100644 index 000000000..2b4f165f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash26.C @@ -0,0 +1,12 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 13 Jun 2005 <nathan@codesourcery.com> + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> +// Bug 21929: ICE on invalid + +template<int> struct A +{ + struct B; +}; + +template<> struct A<void>::B {}; // { dg-error "mismatch|expected|name a type|extra" } diff --git a/gcc/testsuite/g++.dg/parse/crash27.C b/gcc/testsuite/g++.dg/parse/crash27.C new file mode 100644 index 000000000..217928781 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash27.C @@ -0,0 +1,4 @@ +// Bug: 23225 + +void Dispatcher() + (__builtin_offsetof (ArgsType, largeMsgLen)) // { dg-error "initialize|end of input" } diff --git a/gcc/testsuite/g++.dg/parse/crash28.C b/gcc/testsuite/g++.dg/parse/crash28.C new file mode 100644 index 000000000..67d78d6bb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash28.C @@ -0,0 +1,14 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 10 Aug 2005 <nathan@codesourcery.com> + +// PR 23219, ICE +// Origin:Andrew Pinski <pinskia@gcc.gnu.org> +// Volker Reichelt <reichelt@gcc.gnu.org> + +template <class _Tp> class insert_iterator<slist<_Tp> > {}; // { dg-error "not a template|not declared in this scope|expected unqualified-id|extra" } +template <class _Value> class insert_iterator<int > { // { dg-error "template" } + hash_set<_Value>; +}; + +template<int> struct A<X<> > {}; // { dg-error "not a template|not declared in this scope|expected unqualified-id|extra" } +struct A {}; diff --git a/gcc/testsuite/g++.dg/parse/crash29.C b/gcc/testsuite/g++.dg/parse/crash29.C new file mode 100644 index 000000000..29ede042b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash29.C @@ -0,0 +1,10 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 23 Aug 2005 <nathan@codesourcery.com> + +// PR 22454: ICE +// Origin: Volker Reichelt reichelt@gcc.gnu.org + +template<int> struct A +{ + A(void* = &operator new); +}; diff --git a/gcc/testsuite/g++.dg/parse/crash3.C b/gcc/testsuite/g++.dg/parse/crash3.C new file mode 100644 index 000000000..5a48ebc7c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash3.C @@ -0,0 +1,2 @@ +template <class T> struct L { struct I {}; }; +template <class T> void L<T>::I::foo() {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/crash30.C b/gcc/testsuite/g++.dg/parse/crash30.C new file mode 100644 index 000000000..9b68535fa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash30.C @@ -0,0 +1,18 @@ +// { dg-do compile } +namespace N { template<int> struct A { operator int() const; }; } +namespace M { template<int> struct A {}; } +namespace P { typedef int I; } + +template<typename> void foo() +{ + +typename N::A<0>(); // { dg-bogus "expected" } +} + +template<typename> void bar() +{ + +typename M::A<0>; // { dg-error "expected" } +} + +template<typename T> void baz() { + typename P::I i; // { dg-bogus "expected" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash31.C b/gcc/testsuite/g++.dg/parse/crash31.C new file mode 100644 index 000000000..b0a7e1877 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash31.C @@ -0,0 +1,9 @@ +struct A // { dg-error "forward declaration" } +{ + A : A; // { dg-error "expected|incomplete" } + A : B; // { dg-error "not declared|incomplete" } + A : A(); // { dg-error "undefined type|incomplete" } + A : B(); // { dg-error "function call|incomplete|not declared" } + A : A[]; // { dg-error "expected|array reference|incomplete" } + A : B[]; // { dg-error "not declared|expected|array reference|incomplete" } +}; diff --git a/gcc/testsuite/g++.dg/parse/crash32.C b/gcc/testsuite/g++.dg/parse/crash32.C new file mode 100644 index 000000000..df6aa55a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash32.C @@ -0,0 +1,13 @@ +// { dg-do compile } +struct Visitor; + +struct Ast +{ + virtual void accept (Visitor& v); +}; + +void +Ast::accept (Visitor& v) +{ + v (*this); // { dg-error "no match for call" "" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash33.C b/gcc/testsuite/g++.dg/parse/crash33.C new file mode 100644 index 000000000..2ab84df46 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash33.C @@ -0,0 +1,8 @@ +// PR c++/28878 +// { dg-do compile } + +template<int> +void foo() +[ + throw; // { dg-error "expected" } +} // { dg-error "expected" } diff --git a/gcc/testsuite/g++.dg/parse/crash34.C b/gcc/testsuite/g++.dg/parse/crash34.C new file mode 100644 index 000000000..181e58417 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash34.C @@ -0,0 +1,6 @@ +/* PR c++/31745 */ +/* { dg-do compile } */ + +void foo() +{ + namespace N { /* { dg-error "is not allowed|at end of input" } */ diff --git a/gcc/testsuite/g++.dg/parse/crash35.C b/gcc/testsuite/g++.dg/parse/crash35.C new file mode 100644 index 000000000..4937cdc66 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash35.C @@ -0,0 +1,7 @@ +/* This used to ICE. */ +/* { dg-do compile } */ + +struct a {}; + +class foo : public a, a +{ /* { dg-error "duplicate base type|at end of input" } */ diff --git a/gcc/testsuite/g++.dg/parse/crash36.C b/gcc/testsuite/g++.dg/parse/crash36.C new file mode 100644 index 000000000..a5a142c2e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash36.C @@ -0,0 +1,12 @@ +// PR c++/32567 +// { dg-do compile } +// { dg-options "-std=c++98" } + +template <typename... T> struct A // { dg-warning "variadic templates" } +{ + static T &t; // { dg-error "not expanded with" "not expanded" } + // { dg-message "T" "T" { target *-*-* } 7 } + static const int i = sizeof (++t); // { dg-error "was not declared in this scope" } +}; + +int x[A <int>::i]; // { dg-error "constant-expression" } diff --git a/gcc/testsuite/g++.dg/parse/crash37.C b/gcc/testsuite/g++.dg/parse/crash37.C new file mode 100644 index 000000000..8320dfaa5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash37.C @@ -0,0 +1,15 @@ +// PR c++/31941 +// { dg-do compile } + +struct S +{ + S() throw () { } + virtual ~S () throw (); + virtual const char* what () const throw (); +}; + +const char * +foo (S &e) +{ + return e.what ().c_str (); // { dg-error "c_str.*S::what.*which is of non-class type" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash38.C b/gcc/testsuite/g++.dg/parse/crash38.C new file mode 100644 index 000000000..724f9b80a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash38.C @@ -0,0 +1,11 @@ +/* PR c++/33207 */ + +/* This would not ICE. */ +namespace M { } /* { dg-error "previous declaration" } */ +struct M; /* { dg-error "redeclared as different kind of symbol" } */ +M *p; /* { dg-error "does not name a type" } */ + +/* This would ICE when processing 'p'. */ +namespace N { } /* { dg-error "previous declaration" } */ +struct N; /* { dg-error "redeclared as different kind of symbol" } */ +struct N* p; /* { dg-error "redeclared as different kind of symbol|invalid type" } */ diff --git a/gcc/testsuite/g++.dg/parse/crash39.C b/gcc/testsuite/g++.dg/parse/crash39.C new file mode 100644 index 000000000..2f39c10e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash39.C @@ -0,0 +1,3 @@ +// PR c++/31747 + +static extern int i; // { dg-error "conflicting specifiers" } diff --git a/gcc/testsuite/g++.dg/parse/crash4.C b/gcc/testsuite/g++.dg/parse/crash4.C new file mode 100644 index 000000000..a24f0dd00 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash4.C @@ -0,0 +1,12 @@ +struct Bar + { + typedef int type; + }; + + struct Foo + { + void func(void) + { + mutable Bar::type x; // { dg-error "" } + } + }; diff --git a/gcc/testsuite/g++.dg/parse/crash40.C b/gcc/testsuite/g++.dg/parse/crash40.C new file mode 100644 index 000000000..410c2111e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash40.C @@ -0,0 +1,42 @@ +/* PR c++/34059 */ +/* { dg-do compile } */ + +struct A +{ + template<int> void foo(); +}; +struct B : A {}; +struct C : A {}; + +class AA +{ + template<int> void foo(); /* { dg-error "is private" } */ +}; +struct BB : AA {}; + +class AAA { + int get() const {} +}; +struct BBB { + static BBB *foo(); +private: + int get() const {} /* { dg-error "is private" } */ +}; +template<bool> struct S { + S(unsigned int = BBB::foo()->AAA::get()); /* { dg-error "is not a base of" } */ +}; +template<bool> struct SS { + SS(unsigned int = BBB::foo()->get()); +}; + +void bar() +{ + B().C::foo<0>(); /* { dg-error "is not a member of" } */ + BB().AA::foo<0>(); /* { dg-error "within this context" } */ + + int i; + i.C::foo<0>(); /* { dg-error "which is of non-class type" } */ + + S<false> s; /* { dg-error "default argument" } */ + SS<false> ss; /* { dg-error "within this context" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/crash41.C b/gcc/testsuite/g++.dg/parse/crash41.C new file mode 100644 index 000000000..746dbbca8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash41.C @@ -0,0 +1,8 @@ +// PR c++/35327 + +struct A +{ + A(int)(); // { dg-error "declared" } +}; + +template<int> void foo(bool b, A a) { b ? a : 0; } // { dg-error "no match" } diff --git a/gcc/testsuite/g++.dg/parse/crash42.C b/gcc/testsuite/g++.dg/parse/crash42.C new file mode 100644 index 000000000..9cb07d514 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash42.C @@ -0,0 +1,9 @@ +// Created by: Dodji Seketeli <dseketel@redhat.com> +// { dg-do compile } +// { dg-options "-O2 -fprofile-arcs" } +// Origin: PR C++/36767 + +struct A { A (); ~A (); }; +A a[2]; + + diff --git a/gcc/testsuite/g++.dg/parse/crash43.C b/gcc/testsuite/g++.dg/parse/crash43.C new file mode 100644 index 000000000..ff073cf46 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash43.C @@ -0,0 +1,9 @@ +// PR c++/34600 + +namespace N +{ + void foo() + { + extern int i = 0; // { dg-error "'i' has both 'extern' and initializer" } + } +} diff --git a/gcc/testsuite/g++.dg/parse/crash44.C b/gcc/testsuite/g++.dg/parse/crash44.C new file mode 100644 index 000000000..41947b7d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash44.C @@ -0,0 +1,15 @@ +// PR c++/37260 +// { dg-options "" } + +struct pthread_once_t { }; +struct test { + pthread_once_t once; +}; + +int main(void) { + struct test foo = { + once: PTHREAD_ONCE_INITIALIZER // { dg-error "'PTHREAD_ONCE_INITIALIZER' was not declared in this scope" } + }; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/crash45.C b/gcc/testsuite/g++.dg/parse/crash45.C new file mode 100644 index 000000000..8696ab4bb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash45.C @@ -0,0 +1,7 @@ +// PR c++/37348 +// { dg-do compile } + +struct A +{ + template <class> int f (B); // { dg-error "was not declared in this scope|cannot be a member template" } +}; diff --git a/gcc/testsuite/g++.dg/parse/crash46.C b/gcc/testsuite/g++.dg/parse/crash46.C new file mode 100644 index 000000000..f454a0a19 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash46.C @@ -0,0 +1,18 @@ +// PR c++/37532 +// { dg-do compile } + +void +foo (_Decimal32) // { dg-error "declared void" } +{ +} + // { dg-error "was not declared" "" { target *-*-* } 5 } +void +bar (_Bool) // { dg-error "declared void" } +{ +} + // { dg-error "was not declared" "" { target *-*-* } 10 } +void +baz (_Fract) // { dg-error "declared void" } +{ +} + // { dg-error "was not declared" "" { target *-*-* } 15 } diff --git a/gcc/testsuite/g++.dg/parse/crash47.C b/gcc/testsuite/g++.dg/parse/crash47.C new file mode 100644 index 000000000..e77c49fe4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash47.C @@ -0,0 +1,9 @@ +// PR c++/37531 +// { dg-do compile } +// { dg-options "-std=gnu++98" } + +void +foo () +{ + (int[i]) { 0 }; // { dg-error "was not declared in this scope" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash48.C b/gcc/testsuite/g++.dg/parse/crash48.C new file mode 100644 index 000000000..45415484b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash48.C @@ -0,0 +1,9 @@ +// PR c++/37530 +// { dg-do compile } + +void +foo (bool b) +{ + if (b) + try { throw 0; } catch (X) { } // { dg-error "expected type-specifier before" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash49.C b/gcc/testsuite/g++.dg/parse/crash49.C new file mode 100644 index 000000000..07d7c3b2f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash49.C @@ -0,0 +1,10 @@ +// PR c++/37552 +// { dg-do compile } + +extern struct A a[1]; // { dg-error "forward declaration" } + +void +foo () +{ + a[0]; // { dg-error "invalid use of incomplete type" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash5.C b/gcc/testsuite/g++.dg/parse/crash5.C new file mode 100644 index 000000000..0ac702979 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash5.C @@ -0,0 +1,15 @@ +// { dg-options "-w" } + +class QString { // { dg-error "previous definition" } + QString (const QString & a); // { dg-message "QString::QString|candidate expects" } +}; + +class QString { }; // { dg-error "redefinition" } + +const QString q () { + QString z; // { dg-error "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 10 } + int x; + return x ? QString () : QString (); // { dg-error "matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 13 } +} diff --git a/gcc/testsuite/g++.dg/parse/crash50.C b/gcc/testsuite/g++.dg/parse/crash50.C new file mode 100644 index 000000000..711048de1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash50.C @@ -0,0 +1,10 @@ +// Contributed by Dodji Seketeli <dodji@redhat.com> +// Origin PR c++/38636 +// { dg-do compile } + +struct A; // { dg-error "forward declaration of 'struct A'" } + +A::A( + +struct B; // { dg-error "expected '\\)' before ';' token|invalid use of incomplete type 'struct A'" } + diff --git a/gcc/testsuite/g++.dg/parse/crash51.C b/gcc/testsuite/g++.dg/parse/crash51.C new file mode 100644 index 000000000..03fcd3613 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash51.C @@ -0,0 +1,9 @@ +// PR c++/37554 + +struct A {}; +class B : A {}; + +void foo(B b) +{ + (A)b; // { dg-error "inaccessible base" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash52.C b/gcc/testsuite/g++.dg/parse/crash52.C new file mode 100644 index 000000000..bc7f03c8d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash52.C @@ -0,0 +1,3 @@ +// PR c++/39053 + +void foo() = // { dg-error "initialized|expected" } diff --git a/gcc/testsuite/g++.dg/parse/crash53.C b/gcc/testsuite/g++.dg/parse/crash53.C new file mode 100644 index 000000000..de6d412f1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash53.C @@ -0,0 +1,13 @@ +// PR c++/35112 + +namespace X { struct A; } // { dg-error "struct X::A" } +namespace Y { struct A; } // { dg-error "struct Y::A" } +namespace Z { struct A; } // { dg-error "struct Z::A" } +namespace W { struct A; } // { dg-error "struct W::A" } + +using namespace X; +using namespace Y; +using namespace Z; +using namespace W; + +A* p; // { dg-error "reference to 'A' is ambiguous|'A' does not name a type" } diff --git a/gcc/testsuite/g++.dg/parse/crash54.C b/gcc/testsuite/g++.dg/parse/crash54.C new file mode 100644 index 000000000..222082ab7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash54.C @@ -0,0 +1,15 @@ +// PR c++/42057 + +struct A; // { dg-error "forward declaration" } + +struct B +{ + virtual B* foo(A); +}; + +struct C : virtual B +{ + virtual C* foo(A) { return 0; } // { dg-error "incomplete type" } +}; + +C c; diff --git a/gcc/testsuite/g++.dg/parse/crash55.C b/gcc/testsuite/g++.dg/parse/crash55.C new file mode 100644 index 000000000..7676d49bc --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash55.C @@ -0,0 +1,8 @@ +// PR c++/42038 + +extern int __cxa_begin_catch; + +void f(void) +{ + try { } catch (int) { } // { dg-error "cannot be used" } +} diff --git a/gcc/testsuite/g++.dg/parse/crash56.C b/gcc/testsuite/g++.dg/parse/crash56.C new file mode 100644 index 000000000..9a370cb5f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash56.C @@ -0,0 +1,17 @@ +/* PR c++/43081 */ +/* { dg-do compile } */ +/* { dg-options "-std=c++0x" } */ + +struct A +{ + typedef void (F)(); + F f = []{}; /* { dg-error "invalid initializer" } */ +}; + +struct B +{ + typedef void (F)(); + F f = 1; /* { dg-error "invalid initializer" } */ + virtual F f2 = 2; /* { dg-error "invalid initializer" } */ + F f3 = 3; /* { dg-error "invalid initializer" } */ +}; diff --git a/gcc/testsuite/g++.dg/parse/crash57.C b/gcc/testsuite/g++.dg/parse/crash57.C new file mode 100644 index 000000000..c6daf777e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash57.C @@ -0,0 +1,10 @@ +// PR c++/46117 + +struct A +{ + A (typename int); // { dg-error "before|declaration" } +}; + +struct B : A {}; + +B b; diff --git a/gcc/testsuite/g++.dg/parse/crash6.C b/gcc/testsuite/g++.dg/parse/crash6.C new file mode 100644 index 000000000..0cc5c84fa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash6.C @@ -0,0 +1,10 @@ +struct P {}; + +template <typename > +struct O +{ + struct I; +}; + +template <typename T> +struct O<T>::I::S : P {}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/crash7.C b/gcc/testsuite/g++.dg/parse/crash7.C new file mode 100644 index 000000000..86fa47726 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash7.C @@ -0,0 +1,10 @@ +struct A +{ + int foo () const { return 0; } +}; + +template <typename> void bar (int x[], const A &a) +{ + const int i=a.foo(); + x[i]=0; +} diff --git a/gcc/testsuite/g++.dg/parse/crash9.C b/gcc/testsuite/g++.dg/parse/crash9.C new file mode 100644 index 000000000..d121d5dd1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash9.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/10793: ICE in handling base class when the current class +// contains error. + +template <typename> struct A {}; +template <typename> struct A<INVALID> : A<int> { }; // { dg-error "not declared|invalid|token|extra" } diff --git a/gcc/testsuite/g++.dg/parse/ctor1.C b/gcc/testsuite/g++.dg/parse/ctor1.C new file mode 100644 index 000000000..38428842c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor1.C @@ -0,0 +1,9 @@ +class L { +public: + L(int); +}; + +class R { + friend L::L(int); +}; + diff --git a/gcc/testsuite/g++.dg/parse/ctor2.C b/gcc/testsuite/g++.dg/parse/ctor2.C new file mode 100644 index 000000000..604fb2ffd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor2.C @@ -0,0 +1,4 @@ +// PR c++/19244 + +typedef struct { void f(); } f; +void f::f() { } diff --git a/gcc/testsuite/g++.dg/parse/ctor3.C b/gcc/testsuite/g++.dg/parse/ctor3.C new file mode 100644 index 000000000..e597d926f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor3.C @@ -0,0 +1,8 @@ +// PR c++/25633 + +struct A {}; + +struct B : A +{ + B() : A {} // { dg-error "initializer|expected" } +}; diff --git a/gcc/testsuite/g++.dg/parse/ctor4.C b/gcc/testsuite/g++.dg/parse/ctor4.C new file mode 100644 index 000000000..a3e4868e0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor4.C @@ -0,0 +1,7 @@ +// PR c++/27279 +// { dg-do compile } + +struct A +{ + A(void,void); // { dg-error "incomplete type|invalid use" } +}; diff --git a/gcc/testsuite/g++.dg/parse/ctor5.C b/gcc/testsuite/g++.dg/parse/ctor5.C new file mode 100644 index 000000000..3ea23549c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor5.C @@ -0,0 +1,14 @@ +// PR c++/27309 + +struct A +{ + int i; // { dg-error "conflicts" } + A() i() {} // { dg-error "declaration" } +}; + +struct B +{ + A a; +}; + +B b; diff --git a/gcc/testsuite/g++.dg/parse/ctor6.C b/gcc/testsuite/g++.dg/parse/ctor6.C new file mode 100644 index 000000000..0b14ecc6e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor6.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// There is no ambiguity in finding a right constructor for X b(a). + +class X { +public: + X(const X&, int = 3); +}; + +extern X a; +X b(a); diff --git a/gcc/testsuite/g++.dg/parse/ctor7.C b/gcc/testsuite/g++.dg/parse/ctor7.C new file mode 100644 index 000000000..9fa051b79 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor7.C @@ -0,0 +1,15 @@ +//PR c++/28505 + +struct A +{ + A : (); // { dg-error "primary-expression|incomplete type" } + A : (int); // { dg-error "primary-expression|incomplete type|'int'" } +}; + +struct B +{ + char c; + A a; +}; + +B b = (B){0}; // { dg-error "compound-literals" } diff --git a/gcc/testsuite/g++.dg/parse/ctor8.C b/gcc/testsuite/g++.dg/parse/ctor8.C new file mode 100644 index 000000000..e43ce4023 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor8.C @@ -0,0 +1,9 @@ +//PR c++/28505 + +struct A +{ + A : (); // { dg-error "primary-expression|incomplete type" } + A : (int); // { dg-error "primary-expression|incomplete type|'int'" } +}; + +A a = (A){0}; // { dg-error "too many initializers|compound-literals" } diff --git a/gcc/testsuite/g++.dg/parse/ctor9.C b/gcc/testsuite/g++.dg/parse/ctor9.C new file mode 100644 index 000000000..8b2cbf7a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor9.C @@ -0,0 +1,7 @@ +/* PR c++/37647 */ +/* { dg-do compile } */ + +struct A +{ + A() { void A(); } /* { dg-error "return type specification for constructor invalid|non-class scope" } */ +}; diff --git a/gcc/testsuite/g++.dg/parse/dce1.C b/gcc/testsuite/g++.dg/parse/dce1.C new file mode 100644 index 000000000..f4de52257 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dce1.C @@ -0,0 +1,13 @@ +/* Make sure that dead code isn't eliminated too early, avoiding + detection of errors. */ +/* { dg-do compile } */ + +void foo(void) +{ + if (0) + break; /* { dg-error "" } */ + if (1) + ; + else + continue; /* { dg-error "" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/decl-specifier-1.C b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C new file mode 100644 index 000000000..baf0fe778 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/decl-specifier-1.C @@ -0,0 +1,17 @@ +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> +// Origin: PRs 7721 and 7803 +// { dg-do compile } + +namespace N +{ + template<typename> + struct X { }; // { dg-message "N::X" } +} + +N::X X; // { dg-error "" "" } + +int main() +{ + return sizeof(X); // { dg-error "" "" } + // { dg-message "suggested alternative" "suggested alternative" { target *-*-* } 15 } +} diff --git a/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C b/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C new file mode 100644 index 000000000..6c3659f75 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/def-tmpl-arg1.C @@ -0,0 +1,9 @@ +// PR c++/8895 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <typename X, typename Y = B<X> > struct A // { dg-error "" } +{ + A(); + A(const A&); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg1.C b/gcc/testsuite/g++.dg/parse/defarg1.C new file mode 100644 index 000000000..77c50e8c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg1.C @@ -0,0 +1,5 @@ +class A +{ +public: + A(int nBits = ((int)0x8) | ((int)0x4) | ((int)0x2)); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg10.C b/gcc/testsuite/g++.dg/parse/defarg10.C new file mode 100644 index 000000000..bbf9ac04b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg10.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 7 Jun 2005 <nathan@codesourcery.com> + +// From java library. + +void Foo (int = 0); + +class Klasse +{ + friend void Foo (int); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg11.C b/gcc/testsuite/g++.dg/parse/defarg11.C new file mode 100644 index 000000000..60199c2e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg11.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "-pedantic" } + +class foo { +public: + void operator& (int = 1); // { dg-error "default argument" } + void operator++ (int = 2); // { dg-warning "default argument" } + void operator-- (int = 3); // { dg-warning "default argument" } +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg12.C b/gcc/testsuite/g++.dg/parse/defarg12.C new file mode 100644 index 000000000..2d2d7e7a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg12.C @@ -0,0 +1,13 @@ +/* PR28266 This used to ICE in gimple_add_tmp_var */ +/* { dg-do compile } */ + +struct A +{ + int i; + A(int = X); /* { dg-error "was not declared in this scope" }*/ +}; + +void foo() +{ + A().i; /* { dg-error "default argument" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/defarg13.C b/gcc/testsuite/g++.dg/parse/defarg13.C new file mode 100644 index 000000000..27c6db50a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg13.C @@ -0,0 +1,8 @@ +// PR c++/38485 + +template <class Key, class T> +class QMap { }; + +class XMLConfigurations { + void translateToOther(QMap<int, int> match = (QMap<int, int>())); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg14.C b/gcc/testsuite/g++.dg/parse/defarg14.C new file mode 100644 index 000000000..0930b45ee --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg14.C @@ -0,0 +1,6 @@ +// PR c++/28274 + +extern "C" { +void foo (int i, int j = 6); +void foo (int i = 4, int j); +} diff --git a/gcc/testsuite/g++.dg/parse/defarg15.C b/gcc/testsuite/g++.dg/parse/defarg15.C new file mode 100644 index 000000000..b93af4c92 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg15.C @@ -0,0 +1,5 @@ +// PR c++/44991 + +class bar { + void foo(bool a = 3 < 2, bool b = true) {} +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg2.C b/gcc/testsuite/g++.dg/parse/defarg2.C new file mode 100644 index 000000000..571855a3c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg2.C @@ -0,0 +1,9 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Jan 2003 <nathan@codesourcery.com> + +// We erroneously prohibited default args on parenthesized function +// declarations. + +void (foo)(int i = 0); diff --git a/gcc/testsuite/g++.dg/parse/defarg3.C b/gcc/testsuite/g++.dg/parse/defarg3.C new file mode 100644 index 000000000..5c81c69e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg3.C @@ -0,0 +1,5 @@ +struct A { + enum { value = 10 }; + A() { f(); } + static int f(int i=value); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg4.C b/gcc/testsuite/g++.dg/parse/defarg4.C new file mode 100644 index 000000000..bafdadb94 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg4.C @@ -0,0 +1,32 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 3 Jul 2003 <nathan@codesourcery.com> + +// PR c++ 9162. default args got left unprocessed + +struct S { + friend int foo (const S&, int = 100); +}; +S s; +int i = foo (s); + +struct R +{ + template <typename T> R (T, int = 0); +}; + +int Foo () +{ + R s (1); +} + +template <typename T> struct Q +{ + int Foo (T, int = 0); +}; + +int Foo (Q<int> *s) +{ + s->Foo (1); +} diff --git a/gcc/testsuite/g++.dg/parse/defarg5.C b/gcc/testsuite/g++.dg/parse/defarg5.C new file mode 100644 index 000000000..01a67ed59 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg5.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 5 Sep 2003 <nathan@codesourcery.com> +// Origin:Wolfgang Bangerth bangerth@dealii.org + +// PR c++/12167 - infinite recursion + +class A { + void report(int d + // the default arg is what NAN etc can expand to, but + // with the floatiness removed. + = (__extension__ ((union { unsigned l; int d; }) + { l: 0x7fc00000U }).d)); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg6.C b/gcc/testsuite/g++.dg/parse/defarg6.C new file mode 100644 index 000000000..827b605b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg6.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Origin: Falk Hueffner <falk@debian.org> + +// PR c++/13166: ICE default function argument for friend declaration. + +namespace sc_dt { + class sc_length_param { + friend int compare_unsigned(int if_v_signed = 0) {} + }; +} diff --git a/gcc/testsuite/g++.dg/parse/defarg7.C b/gcc/testsuite/g++.dg/parse/defarg7.C new file mode 100644 index 000000000..c1f75ce8f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg7.C @@ -0,0 +1,5 @@ +// PR c++/14361 + +class A { + A ( int n=0 int n ); // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg8.C b/gcc/testsuite/g++.dg/parse/defarg8.C new file mode 100644 index 000000000..1f1f078aa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg8.C @@ -0,0 +1,10 @@ +struct A { + static void g(int); +}; + +struct S { + static int i; + + friend void f(int = i); + friend void A::g(int = i); +}; diff --git a/gcc/testsuite/g++.dg/parse/defarg9.C b/gcc/testsuite/g++.dg/parse/defarg9.C new file mode 100644 index 000000000..8496cfb26 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/defarg9.C @@ -0,0 +1,20 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 6 Jun 2005 <nathan@codesourcery.com> + +// PR 21903:Reject legal with default arg confusion +// Origin: Wolfgang Bangerth <bangerth@dealii.org> + + +struct O { + template<typename T> struct B { + void set (T, bool=true); + }; + + struct D : public B<int> {}; +}; + +void x () +{ + O::D d; + d.set(1); +} diff --git a/gcc/testsuite/g++.dg/parse/direct-initialization-2.C b/gcc/testsuite/g++.dg/parse/direct-initialization-2.C new file mode 100644 index 000000000..f362c74a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/direct-initialization-2.C @@ -0,0 +1,18 @@ +// Copyright (C) 2002 Free Software Foundation +// Origin: C++/729 +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> +// { dg-do compile } + +struct A { + A(int) { } +}; + +struct B { + typedef B T; + B(A, char**) {} +}; + +int main(int argc, char** argv) +{ + B::T t(A(argc), argv); +} diff --git a/gcc/testsuite/g++.dg/parse/dot1.C b/gcc/testsuite/g++.dg/parse/dot1.C new file mode 100644 index 000000000..3b027d7c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dot1.C @@ -0,0 +1,4 @@ +// PR c++/24560 + +struct A { void f(); }; +void g() { A().f.a; } // { dg-error "class" } diff --git a/gcc/testsuite/g++.dg/parse/dtor1.C b/gcc/testsuite/g++.dg/parse/dtor1.C new file mode 100644 index 000000000..08d070ea5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor1.C @@ -0,0 +1,6 @@ +struct A { typedef int I; }; +int main(void) +{ + int * p; + p->A::I::~I(); +} diff --git a/gcc/testsuite/g++.dg/parse/dtor10.C b/gcc/testsuite/g++.dg/parse/dtor10.C new file mode 100644 index 000000000..a6e905422 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor10.C @@ -0,0 +1,9 @@ +// PR c++/27508 +// { dg-do compile } + +namespace N +{ + struct A { ~A(); }; +} + +N::~A () {} // { dg-error "not a class-name" } diff --git a/gcc/testsuite/g++.dg/parse/dtor11.C b/gcc/testsuite/g++.dg/parse/dtor11.C new file mode 100644 index 000000000..63ffb60ba --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor11.C @@ -0,0 +1,12 @@ +// PR c++/28606 +// { dg-do compile } + +struct A +{ + ~A A(); // { dg-error "destructor" } +}; + +struct B +{ + A::~B B(); // { dg-error "as member of" } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor12.C b/gcc/testsuite/g++.dg/parse/dtor12.C new file mode 100644 index 000000000..1acdfa36b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor12.C @@ -0,0 +1,6 @@ +// PR c++/29408 + +template <class T> class a +{ + ~a<T>(); +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor13.C b/gcc/testsuite/g++.dg/parse/dtor13.C new file mode 100644 index 000000000..96c0d227b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor13.C @@ -0,0 +1,8 @@ +/* PR c++/34963 This used to ICE */ +/* { dg-do compile } */ + +struct A +{ + static friend A::~A(); /* { dg-error "storage class specifiers|extra qualification|implicitly friend" } */ +}; + diff --git a/gcc/testsuite/g++.dg/parse/dtor14.C b/gcc/testsuite/g++.dg/parse/dtor14.C new file mode 100644 index 000000000..6ba7a5b6c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor14.C @@ -0,0 +1,8 @@ +// PR c++/39054 + +struct A {}; + +template<typename> void foo() +{ + A().~int(); // { dg-error "expected" } +} diff --git a/gcc/testsuite/g++.dg/parse/dtor15.C b/gcc/testsuite/g++.dg/parse/dtor15.C new file mode 100644 index 000000000..ae85a702a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor15.C @@ -0,0 +1,16 @@ +// PR c++/39225 + +template <class T> +class A +{ +public: + A() {} + ~B() {} // { dg-error "~B" } +}; + +int main() +{ + A<int> *a = new A<int>; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/dtor2.C b/gcc/testsuite/g++.dg/parse/dtor2.C new file mode 100644 index 000000000..60e132b4a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor2.C @@ -0,0 +1,4 @@ +struct A { + typedef A A2; + ~A2(); // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor3.C b/gcc/testsuite/g++.dg/parse/dtor3.C new file mode 100644 index 000000000..3041ae4a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor3.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// Contributed by Wolfgang Bangerth <bangerth at dealii dot org> +// PR c++/12335: Make sure we don't ICE on the qualified-id form of a +// destructor call. + +struct Y { + ~Y() {} // { dg-bogus "note" "implemented DR272" { xfail *-*-* } } +}; + +struct X : Y { + ~X() {} // { dg-bogus "note" "implemented DR272" { xfail *-*-* } } + void f() { + X::~X(); // { dg-bogus "" "implemented DR272" { xfail *-*-* } } + Y::~Y(); // { dg-bogus "" "implemented DR272" { xfail *-*-* } } + } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor4.C b/gcc/testsuite/g++.dg/parse/dtor4.C new file mode 100644 index 000000000..729ee2fa1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor4.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// Contributed by Paul Koning <pkoning at equallogic dot com> +// PR c++/15947: Accept destructor as template in qualified-id + +template <int N> struct X { + ~X(); +}; + +template <int N> +X<N>::~X<N>(){} diff --git a/gcc/testsuite/g++.dg/parse/dtor5.C b/gcc/testsuite/g++.dg/parse/dtor5.C new file mode 100644 index 000000000..297a0e737 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor5.C @@ -0,0 +1,12 @@ +// PR c++/19732 + +struct A; +typedef int ~A; // { dg-error "non-function" } +struct B { + ~A(); // { dg-error "" } + typedef int ~A; // { dg-error "non-function" } + void f() { + extern ~B(); // { dg-error "non-member" } + } +}; +void ~A(); // { dg-error "non-member" } diff --git a/gcc/testsuite/g++.dg/parse/dtor6.C b/gcc/testsuite/g++.dg/parse/dtor6.C new file mode 100644 index 000000000..3333161c3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor6.C @@ -0,0 +1,8 @@ +// PR c++/25638 + +struct A { ~A(); }; // { dg-error "candidate" } + +struct B : A +{ + template<int> friend A::~A(); // { dg-error "match" } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor7.C b/gcc/testsuite/g++.dg/parse/dtor7.C new file mode 100644 index 000000000..a80951266 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor7.C @@ -0,0 +1,4 @@ +// PR c++/25856 + +struct A; // { dg-error "forward" } +A::~A() {} // { dg-error "incomplete" } diff --git a/gcc/testsuite/g++.dg/parse/dtor8.C b/gcc/testsuite/g++.dg/parse/dtor8.C new file mode 100644 index 000000000..2fe0a974b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor8.C @@ -0,0 +1,8 @@ +// { dg-do compile } + +struct A {}; + +struct B +{ + friend A::~B(); // { dg-error "as member of" } +}; diff --git a/gcc/testsuite/g++.dg/parse/dtor9.C b/gcc/testsuite/g++.dg/parse/dtor9.C new file mode 100644 index 000000000..64c82ce67 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor9.C @@ -0,0 +1,5 @@ +// PR c++/27508 +// { dg-do compile } + +struct A; +using ::~A; // { dg-error "not a class-name" } diff --git a/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C b/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C new file mode 100644 index 000000000..a7beabc90 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dupl-tmpl-args1.C @@ -0,0 +1,13 @@ +// PR c++/8928 +// Origin: <sebor@roguewave.com> +// { dg-do compile } + +namespace N +{ + +template <typename T, typename U> struct A {}; +typedef A<int, int> B; + +} + +N::B<int, int> a; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/eh-decl.C b/gcc/testsuite/g++.dg/parse/eh-decl.C new file mode 100644 index 000000000..1c72fd39f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/eh-decl.C @@ -0,0 +1,8 @@ +// PR c++/41876 + +struct A; + +void foo() +{ + try {} catch(int A) {} +} diff --git a/gcc/testsuite/g++.dg/parse/elab1.C b/gcc/testsuite/g++.dg/parse/elab1.C new file mode 100644 index 000000000..92fcd1ca6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/elab1.C @@ -0,0 +1,9 @@ +namespace Name { + + typedef void *(*Function)( void *, int ); // { dg-error "previous declaration" } + + struct Foo { + struct Function xyz[5]; // { dg-error "" } + }; + +} diff --git a/gcc/testsuite/g++.dg/parse/elab2.C b/gcc/testsuite/g++.dg/parse/elab2.C new file mode 100644 index 000000000..6b42aed67 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/elab2.C @@ -0,0 +1,7 @@ +struct A {}; + +struct B +{ + typedef A T; // { dg-error "previous declaration" } + friend struct T; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/else-2.C b/gcc/testsuite/g++.dg/parse/else-2.C new file mode 100644 index 000000000..7f0b23cd7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/else-2.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options " " } + +int f() +{ + + else // { dg-error "'else' without a previous 'if'" } + { + return 0; + } +} diff --git a/gcc/testsuite/g++.dg/parse/else.C b/gcc/testsuite/g++.dg/parse/else.C new file mode 100644 index 000000000..87ea982a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/else.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// { dg-options " " } + +int f() +{ + if (1) + { + return 1; + else // { dg-error "expected .\}. before 'else'" } + { + return 0; + } +} diff --git a/gcc/testsuite/g++.dg/parse/enum1.C b/gcc/testsuite/g++.dg/parse/enum1.C new file mode 100644 index 000000000..d5c5f8688 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum1.C @@ -0,0 +1,4 @@ +// PR c++/15862 + +enum yn { Y, N }; +enum yn x = Y; diff --git a/gcc/testsuite/g++.dg/parse/enum2.C b/gcc/testsuite/g++.dg/parse/enum2.C new file mode 100644 index 000000000..f77f91701 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum2.C @@ -0,0 +1,7 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/18123: ICE pushing tag from invalid template. + +template<int> enum E { e }; // { dg-error "declaration|expected" } diff --git a/gcc/testsuite/g++.dg/parse/enum3.C b/gcc/testsuite/g++.dg/parse/enum3.C new file mode 100644 index 000000000..dc07193d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum3.C @@ -0,0 +1,5 @@ +// PR c++/28261 + +struct A {}; // { dg-error "A::A" } + +A::A (enum { e }) {} // { dg-error "defined|prototype" } diff --git a/gcc/testsuite/g++.dg/parse/enum4.C b/gcc/testsuite/g++.dg/parse/enum4.C new file mode 100644 index 000000000..6a20ea9cb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum4.C @@ -0,0 +1,10 @@ +// PR c++/37389 +// { dg-do compile } +// { dg-options "-std=gnu++98" } + +enum +{ + A = 9223372036854775807ULL * 2 + 1, + B = B0, // { dg-error "was not declared|overflow" } + C = C0 // { dg-error "was not declared" } +}; diff --git a/gcc/testsuite/g++.dg/parse/enum5.C b/gcc/testsuite/g++.dg/parse/enum5.C new file mode 100644 index 000000000..3ebb02f75 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/enum5.C @@ -0,0 +1,17 @@ +// PR c++/41127 + +#define CHAR_BIT 8 +enum EE {ee}; +typedef unsigned int T; + +struct D { + T : sizeof(unsigned int) * CHAR_BIT; // OK + EE : sizeof(EE) * CHAR_BIT; // OK + enum EE : sizeof(EE) * CHAR_BIT; // not OK + enum EE xxxx : sizeof(EE) * CHAR_BIT; // OK + T x : sizeof(unsigned int) * CHAR_BIT; // OK + enum FF {ff} : sizeof(int) * CHAR_BIT; // OK +} element; + +enum EE xx; +EE yy; diff --git a/gcc/testsuite/g++.dg/parse/error-column.C b/gcc/testsuite/g++.dg/parse/error-column.C new file mode 100644 index 000000000..18dc4633a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error-column.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// Make sure column information is correctly shown in error reporting +// { dg-options "-fshow-column" } + + +void foo () +{ + cout << "blah"; // { dg-error "3:'cout'" } +} diff --git a/gcc/testsuite/g++.dg/parse/error1.C b/gcc/testsuite/g++.dg/parse/error1.C new file mode 100644 index 000000000..1f8bb3773 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error1.C @@ -0,0 +1,7 @@ +// { dg-options "-fshow-column" } +struct INCOMPLETE; +template <int> struct X { + static INCOMPLETE value; +}; +template <> INCOMPLETE X<1>::value = 0; // { dg-error "30:variable 'INCOMPLETE X<1>::value' has initializer but incomplete type" } + diff --git a/gcc/testsuite/g++.dg/parse/error10.C b/gcc/testsuite/g++.dg/parse/error10.C new file mode 100644 index 000000000..8301172ad --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error10.C @@ -0,0 +1,19 @@ +// PR c++/3478 +// { dg-options "-fshow-column" } + +template <typename> struct A +{ + enum E {}; +}; + +template <typename T> void foo() +{ + enum A<void>::E e1; + typename A<T>::E e2; + enum A<T>::E e3; + enum typename A<T>::E e4; +} + +// Here, columns nums are not very accurate either. Still acceptable though +// { dg-error "30:invalid type in declaration before ';' token" "" { target *-*-* } 14 } +// { dg-error "30:two or more data types in declaration of 'e4'" "" { target *-*-* } 14 } diff --git a/gcc/testsuite/g++.dg/parse/error11.C b/gcc/testsuite/g++.dg/parse/error11.C new file mode 100644 index 000000000..39039a880 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error11.C @@ -0,0 +1,71 @@ +// { dg-do compile } +// { dg-options "-fshow-column" }" +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// Try to find out when the digraph '<:' is used as a mistake, and parse it +// correctly to avoid cascaded errors. + +struct B; + +template <class A> +struct Foo +{ + template <class T> + struct Nested + { + static void method(void) {} + }; + + void method(void) { + typename Foo<::B>::template Nested<::B> n; // { dg-error "17:'<::' cannot begin" "17-begin" } +// { dg-message "17:'<:' is an alternate spelling" "17-alt" { target *-*-* } 19 } +// { dg-error "39:'<::' cannot begin" "39-begin" { target *-*-* } 19 } +// { dg-message "39:'<:' is an alternate spelling" "39-alt" { target *-*-* } 19 } + n.template Nested<B>::method(); + n.template Nested<::B>::method(); // { dg-error "22:'<::' cannot begin" "error" } +// { dg-message "22:'<:' is an alternate" "note" { target *-*-* } 24 } + Nested<B>::method(); + Nested<::B>::method(); // { dg-error "11:'<::' cannot begin" "error" } +// { dg-message "11:'<:' is an alternate" "note" { target *-*-* } 27 } + } +}; + +template <int N> struct Foo2 {}; +template struct Foo2<::B>; // { dg-error "21:'<::' cannot begin" "begin" } +// { dg-message "21:'<:' is an alternate" "alt" { target *-*-* } 33 } +// { dg-message "25:type/value mismatch" "mismatch" { target *-*-* } 33 } +// { dg-error "25:expected a constant" "const" { target *-*-* } 33 } + +int value = 0; + +void func(void) +{ + Foo<::B> f; // { dg-error "cannot begin" "begin" } +// { dg-message "alternate spelling" "alt" { target *-*-* } 42 } + f.Foo<B>::method(); + f.Foo<::B>::method(); // { dg-error "8:cannot begin" "begin" } +// { dg-message "8:alternate spelling" "alt" { target *-*-* } 45 } + + // Check cases where we the token sequence is the correct one, but there + // was no digraph or whitespaces in the middle, so we should not emit + // the special error message. + Foo<: :B> k2; // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" } + Foo[:B> k1; // { dg-bogus "cannot begin|alternate spelling" "smart error should not be triggered here" } +// { dg-error "6:missing template arguments before" "template" { target *-*-* } { 51 } } +// { dg-error "9:expected primary-expression before ':' token" "primary" { target *-*-* } 51 } +// { dg-error "9:expected '\]' before ':' token" "backslash" { target *-*-* } 51 } +// { dg-error "9:expected ';' before ':' token" "semicolon" { target *-*-* } 51 } +// { dg-error "6:missing template arguments before" "template" { target *-*-* } 52 } +// { dg-error "7:expected primary-expression before ':' token" "primary" { target *-*-* } 52 } +// { dg-error "7:expected '\]' before ':' token" "backslash" { target *-*-* } 52 } +// { dg-error "7:expected ';' before ':' token" "semicolon" { target *-*-* } 52 } +// + int Foo[2]; + Foo[::value] = 0; +} + +template struct Foo<::B>; // { dg-error "20:'<::' cannot begin" "begin" } +// { dg-message "20:is an alternate" "alt" { target *-*-* } 66 } + +// On the first error message, an additional note about the use of +// -fpermissive should be present +// { dg-message "17:\\(if you use '-fpermissive' G\\+\\+ will accept your code\\)" "-fpermissive" { target *-*-* } 19 } diff --git a/gcc/testsuite/g++.dg/parse/error12.C b/gcc/testsuite/g++.dg/parse/error12.C new file mode 100644 index 000000000..3ebcf3894 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error12.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Origin: Giovanni Bajo <giovannibajo at gcc dot gnu dot org> +// Make sure the error about '<:' can be turned into a warning +// { dg-options "-fpermissive -fshow-column" } + +struct B; + +template <class A> +struct Foo {}; + +Foo<::B> foo; // { dg-bogus "error" "error in place of warning" } +// { dg-warning "4: '<::' cannot begin a template-argument list" "warning <::" { target *-*-* } 11 } +// { dg-message "4:'<:' is an alternate spelling for '.'. Insert whitespace between '<' and '::'" "note <:" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/parse/error13.C b/gcc/testsuite/g++.dg/parse/error13.C new file mode 100644 index 000000000..9bce98d7f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error13.C @@ -0,0 +1,14 @@ +// { dg-options "-fshow-column" } +// PR c++/13975 + +public: // { dg-error "1:expected unqualified-id before 'public'" } + +int i; + +protected: // { dg-error "1:expected unqualified-id before 'protected'" } + +int j; + +private: // { dg-error "1:expected unqualified-id before 'private'" } + +int k; diff --git a/gcc/testsuite/g++.dg/parse/error14.C b/gcc/testsuite/g++.dg/parse/error14.C new file mode 100644 index 000000000..04f2f56b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error14.C @@ -0,0 +1,26 @@ +// { dg-options "-fshow-column" } +// PR c++/13970 + +struct X +{ + template< typename Z > Z Zunc() + { + return Z(); + } + + template< typename Z > void Zinc() + { + } + + void tst() + { + Zunc<int>(); + + Zinc<int>( //); + // } + +}; // { dg-error "2:expected '.' at end of input" "at end of input" } + // { dg-error "1:expected primary-expression before '.' token" "primary" { target *-*-* } 22 } + // { dg-error "1:expected unqualified-id" "unqualified-id" { target *-*-* } 22 } + // { dg-error "1:expected ';' before '.' token" "function" { target *-*-* } 22 } + diff --git a/gcc/testsuite/g++.dg/parse/error15.C b/gcc/testsuite/g++.dg/parse/error15.C new file mode 100644 index 000000000..607a1dbb8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error15.C @@ -0,0 +1,41 @@ +// { dg-do compile } +// Contributed by Volker Reichelt <reichelt at gcc dot gnu dot org> +// { dg-options "-fshow-column" } +// PR c++/14008: Improve diagnostic on invalid types in declarators. + +namespace N +{ + template<int> struct A {}; + struct C {}; + int K; +} + +N::A f2; // { dg-error "1:invalid use of template-name 'N::A' without an argument list" } +N::INVALID f3; // { dg-error "1:'INVALID' in namespace 'N' does not name a type" } +N::C::INVALID f4; // { dg-error "1:'INVALID' in 'struct N::C' does not name a type" } +N::K f6; // { dg-error "1:'K' in namespace 'N' does not name a type" } +typename N::A f7; +// { dg-error "13:invalid use of template-name 'N::A' without an argument list" "13" { target *-*-* } 17 } +// { dg-error "17:invalid type in declaration before ';' token" "17" { target *-*-* } 17 } + +struct B +{ + N::A f2; // { dg-error "3:invalid use of template-name 'N::A' without an argument list" } + N::INVALID f3; // { dg-error "3:'INVALID' in namespace 'N' does not name a type" } + N::C::INVALID f4; // { dg-error "3:'INVALID' in 'struct N::C' does not name a type" } + N::K f6; // { dg-error "3:'K' in namespace 'N' does not name a type" } + typename N::A f7; +// { dg-error "15:invalid use of template-name 'N::A' without an argument list" "15" { target *-*-* } 27 } +}; + +template <int> +struct C +{ + N::A f2; // { dg-error "3:invalid use of template-name 'N::A' without an argument list" } + N::INVALID f3; // { dg-error "3:'INVALID' in namespace 'N' does not name a type" } + N::C::INVALID f4; // { dg-error "3:'INVALID' in 'struct N::C' does not name a type" } + N::K f6; // { dg-error "3:'K' in namespace 'N' does not name a type" } + typename N::A f7; // { dg-error "15:invalid use of template-name 'N::A' without an argument list" } +}; + +// { dg-bogus "bogus excess errors in declaration" "bogus excess errors in declaration" { target *-*-* } 17 } diff --git a/gcc/testsuite/g++.dg/parse/error16.C b/gcc/testsuite/g++.dg/parse/error16.C new file mode 100644 index 000000000..3d9dcc334 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error16.C @@ -0,0 +1,9 @@ +// { dg-options "-fshow-column" } +// PR c++/16964 + +struct A +{ + struct B {}; // { dg-error "10:previous definition of 'struct A::B'" } +}; + +struct A::B{}; // { dg-error "11:redefinition of 'struct A::B'" } diff --git a/gcc/testsuite/g++.dg/parse/error17.C b/gcc/testsuite/g++.dg/parse/error17.C new file mode 100644 index 000000000..b308c912f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error17.C @@ -0,0 +1,9 @@ +// { dg-options "-fshow-column" } +// PR c++/16965 + +template <typename T> struct B { + static int Bar(T); // { dg-error "14:candidates are: |with T = int" } +}; +struct D : B<int>, B<char> {}; + +int i2 = D::Bar(2); // { dg-error "10:reference to 'Bar' is ambiguous" } diff --git a/gcc/testsuite/g++.dg/parse/error18.C b/gcc/testsuite/g++.dg/parse/error18.C new file mode 100644 index 000000000..b5e722221 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error18.C @@ -0,0 +1,8 @@ +// { dg-options "-fshow-column" } +// PR c++/16002 + +void f() +{ + double Q *= 5.0; // { dg-error "12:expected initializer before '..' token" } +} + diff --git a/gcc/testsuite/g++.dg/parse/error19.C b/gcc/testsuite/g++.dg/parse/error19.C new file mode 100644 index 000000000..010a4032e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error19.C @@ -0,0 +1,15 @@ +// { dg-options "-fshow-column -fmessage-length=0 -ansi -pedantic-errors -Wno-long-long " } +// PR C++/17867 + +struct A // { dg-message "8:operator=|no known conversion for implicit" } +{ + A(int); +}; + +const A& foo(); + +void bar() +{ + foo()=A(0); // { dg-error "12:no match for 'operator='" } + // { dg-message "candidate" "candidate note" { target *-*-* } 13 } +} diff --git a/gcc/testsuite/g++.dg/parse/error2.C b/gcc/testsuite/g++.dg/parse/error2.C new file mode 100644 index 000000000..7b08df454 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error2.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-options "-fshow-column -std=c++98" } +// Properly print CALL_EXPRs while dumping expressions + +double g; +int func(double); + +template <int> +struct Foo {}; + +Foo<func(g)> f; // { dg-error "5:'int func.double.' cannot appear in a constant-expression" "" { target *-*-* } 11 } +// { dg-error "10:'g' cannot appear in a constant-expression" "" { target *-*-* } 11 } +// { dg-error "11:a function call cannot appear in a constant-expression" "" { target *-*-* } 11 } +// { dg-error "12:template argument 1 is invalid" "" { target *-*-* } 11 } +// { dg-error "15:invalid type in declaration before ';' token" "" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/parse/error20.C b/gcc/testsuite/g++.dg/parse/error20.C new file mode 100644 index 000000000..d2f9353a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error20.C @@ -0,0 +1,18 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/17821 + +struct A { + A(int i) {} +}; +struct B { + int i; +}; +struct C { + B* p; +}; +int main() { + C c; + A(c.p.i); // { dg-error "9:request for member 'i' in 'c.C::p', which is of non-class type 'B" } + return 0; +} + diff --git a/gcc/testsuite/g++.dg/parse/error21.C b/gcc/testsuite/g++.dg/parse/error21.C new file mode 100644 index 000000000..469e5fb4e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error21.C @@ -0,0 +1,13 @@ +// PR c++/17393 +// { dg-options "-Wall -fshow-column" } + +struct A { }; + +void foo() +{ + // Check that we do not complain about an unused + // compiler-generated variable. + A& = a; // { dg-error "6:expected unqualified-id before '=' token" "6" } + // { dg-error "8:'a' was not declared in this scope" "8" { target *-*-* } 10 } +} + diff --git a/gcc/testsuite/g++.dg/parse/error22.C b/gcc/testsuite/g++.dg/parse/error22.C new file mode 100644 index 000000000..29552c67a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error22.C @@ -0,0 +1,6 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/15786 + +struct A { + void foo(bar* p); /* { dg-error "12:'bar' has not been declared" } */ +}; diff --git a/gcc/testsuite/g++.dg/parse/error23.C b/gcc/testsuite/g++.dg/parse/error23.C new file mode 100644 index 000000000..9c19b562c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error23.C @@ -0,0 +1,9 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/19149 + +struct QChar { + QChar( char c ); + QChar( const QChar& c ); + //following column number is not accurate enough but will make it for now + static const ; // { dg-error "10:declaration does not declare anything" } +}; diff --git a/gcc/testsuite/g++.dg/parse/error24.C b/gcc/testsuite/g++.dg/parse/error24.C new file mode 100644 index 000000000..c8ab6d992 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error24.C @@ -0,0 +1,8 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/19395 + +struct A { + typedef int ::X; // { dg-error "17:typedef name may not be a nested-name-specifier" } +}; + + diff --git a/gcc/testsuite/g++.dg/parse/error25.C b/gcc/testsuite/g++.dg/parse/error25.C new file mode 100644 index 000000000..a0fd24c3a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error25.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// Origin: Steven Bosscher <steven at gcc dot gnu dot org> +// PR c++/17401: ICE with invalid pure specifier + +// NOTE: This also tests QoI of diagnostic for invalid pure specifiers. +// Please do *not* relax the dg-error tests. + +class foo +{ + virtual void bar1 () = 0; + virtual void bar2 () = __null; // { dg-error "32:invalid pure specifier" } + virtual void bar3 () = 4; // { dg-error "27:invalid pure specifier" } + virtual void bar4 () = A::f; // { dg-error "27:invalid pure specifier" } + virtual void bar5 () = 0l; // { dg-error "28:invalid pure specifier" } + virtual void bar6 () = 00; // { dg-error "28:invalid pure specifier" } + virtual void bar7 () = 0x0; // { dg-error "29:invalid pure specifier" } +}; diff --git a/gcc/testsuite/g++.dg/parse/error26.C b/gcc/testsuite/g++.dg/parse/error26.C new file mode 100644 index 000000000..befaf3bb3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error26.C @@ -0,0 +1,14 @@ +// PR c++/20148 +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } + +void foo() +{ + if (({int c[2];})) ; // { dg-error "7:ISO C.. forbids" "7" } + // { dg-error "20:could not convert" "20" { target *-*-* } 6 } +} + +void bar() +{ + if (({})); // { dg-error "7:ISO C.. forbids" "7" } + // { dg-error "11:could not convert" "11" { target *-*-* } 12 } +} diff --git a/gcc/testsuite/g++.dg/parse/error27.C b/gcc/testsuite/g++.dg/parse/error27.C new file mode 100644 index 000000000..90cb231c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error27.C @@ -0,0 +1,8 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/20152 + +struct KrSelectionMode { virtual void init() = 0; }; // { dg-error "8:previous definition of 'struct KrSelectionMode'" } +struct KrKDESelectionMode : public KrSelectionMode { void init() { } }; // { dg-error "8:previous definition of 'struct KrKDESelectionMode'" } +struct KrSelectionMode { virtual void init() = 0; }; // { dg-error "8:redefinition of 'struct KrSelectionMode'" } +struct KrKDESelectionMode : public KrSelectionMode { void init() { } }; // { dg-error "8:redefinition of 'struct KrKDESelectionMode'" } +KrKDESelectionMode krKDESelectionMode; diff --git a/gcc/testsuite/g++.dg/parse/error28.C b/gcc/testsuite/g++.dg/parse/error28.C new file mode 100644 index 000000000..3ca210aa6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error28.C @@ -0,0 +1,12 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/21908 + +struct virt { virt () {} virt (int i) {} }; +struct der : public virtual virt { // { dg-message "8:der::der|candidate expects" } + der (int i) : virt(i) {} // { dg-message "3:der::der|candidate expects" } +}; +struct top : public der { + top () {} // { dg-bogus "der\\(const" } + // { dg-message "candidate" "candidate note" { target *-*-* } 9 } +}; +// { dg-error "10:no matching function for call to 'der" "" { target *-*-* } 9 } diff --git a/gcc/testsuite/g++.dg/parse/error29.C b/gcc/testsuite/g++.dg/parse/error29.C new file mode 100644 index 000000000..2c3a3a7f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error29.C @@ -0,0 +1,13 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/25637 + +struct A { + void foo(); + A(); + void operator delete(void *); +}; +struct B { + friend void A::foo() {} // { dg-error "22:cannot define member function 'A::foo' within 'B'" } + friend void A::operator delete(void*) {} // { dg-error "39:cannot define member function 'A::operator delete' within 'B'" } + friend A::A() {} // { dg-error "15:cannot define member function 'A::A' within 'B'" } +}; diff --git a/gcc/testsuite/g++.dg/parse/error3.C b/gcc/testsuite/g++.dg/parse/error3.C new file mode 100644 index 000000000..7e8cf8de0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error3.C @@ -0,0 +1,9 @@ +// { dg-options "-fshow-column" } +// PR c++/10779 + +static void InstantiateConstraint(const float&, unsigned, + void(*AddFunction)(const TYPE&,bool&, + char*, char*, + unsigned*)); +// { dg-error "64: ISO C\\+\\+ forbids declaration of 'parameter' with no type" "" { target *-*-* } { 5 } } +// { dg-error "60: 'TYPE' does not name a type" "" { target *-*-* } { 5 } } diff --git a/gcc/testsuite/g++.dg/parse/error30.C b/gcc/testsuite/g++.dg/parse/error30.C new file mode 100644 index 000000000..26c55c49c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error30.C @@ -0,0 +1,12 @@ +// PR c++/30854 +// { dg-do compile } +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } + +struct A +{ + A(); + A(int); +}; + +A a = -A(); // { dg-error "10:no match for.*operator-.*in.*-A\\(\\)" } +A b = -A(5); // { dg-error "11:no match for.*operator-.*in.*-A\\(5\\)" } diff --git a/gcc/testsuite/g++.dg/parse/error31.C b/gcc/testsuite/g++.dg/parse/error31.C new file mode 100644 index 000000000..e39285227 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error31.C @@ -0,0 +1,14 @@ +// { dg-options "-fshow-column -ansi -pedantic-errors -Wno-long-long" } +// PR c++/32190 + +template<typename T> class foo{ }; + +int main() { + foo<int> i; + // this column number is not accurate yet, but that will make it for now. + foo<foo<int> j; // { dg-error "18:template argument 1 is invalid" } + int k; + int l; + foo<int> m; + return 0; + } diff --git a/gcc/testsuite/g++.dg/parse/error32.C b/gcc/testsuite/g++.dg/parse/error32.C new file mode 100644 index 000000000..da27afdda --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error32.C @@ -0,0 +1,12 @@ +/* PR c++/37555 */ +/* { dg-do compile } */ + +struct A {}; + +typedef void (A::T)(); /* { dg-error "typedef name may not be a nested-name-specifier" } */ + +void foo() +{ + T t; + t; /* { dg-error "was not declared" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/error33.C b/gcc/testsuite/g++.dg/parse/error33.C new file mode 100644 index 000000000..e3a7166ed --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error33.C @@ -0,0 +1,16 @@ +/* PR c++/37556 */ +/* { dg-do compile } */ + +struct A +{ + void foo(); +}; + +typedef void (A::T)(); /* { dg-error "typedef name may not be a nested" } */ + +void bar(T); /* { dg-message "note: declared here" } */ + +void baz() +{ + bar(&A::foo); /* { dg-error "too many arguments" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/error34.C b/gcc/testsuite/g++.dg/parse/error34.C new file mode 100644 index 000000000..449ea689a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error34.C @@ -0,0 +1,8 @@ +// PR c++/33465 + +int foo(int); + +void bar(double d) +{ + foo(d)(); // { dg-error "foo\\(\\(int\\)d\\)" } +} diff --git a/gcc/testsuite/g++.dg/parse/error35.C b/gcc/testsuite/g++.dg/parse/error35.C new file mode 100644 index 000000000..59e726a31 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error35.C @@ -0,0 +1,8 @@ +// PR c++/33465 + +int foo(double); + +void bar(int i) +{ + foo(i)(); // { dg-error "foo\\(\\(double\\)i\\)" } +} diff --git a/gcc/testsuite/g++.dg/parse/error36.C b/gcc/testsuite/g++.dg/parse/error36.C new file mode 100644 index 000000000..8fcaa2fb2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error36.C @@ -0,0 +1,32 @@ +// PR c++/15946 +// Test for helpful error message about missing typename. + +template <class T> struct A +{ + struct B { }; + static B b; +}; + +template <class T> +void f(T t) +{ + typedef A<T>::foo type; // { dg-error "typename" } + A<T>::bar b; // { dg-error "typename" } +} // { dg-error "expected ';'" "" { target *-*-* } 14 } + +// PR c++/36353 +template <class T> struct B +{ + void f() + { + A<T>::baz z; // { dg-error "typename" } + } // { dg-error "expected ';'" "" { target *-*-* } 22 } +}; + +// PR c++/40738 +template <class T> +void g(const A<T>::type &t); // { dg-error "typename" } +// { dg-error "no type" "" { target *-*-* } 28 } + +// PR c++/18451 +template <class T> A<T>::B A<T>::b; // { dg-error "typename" } diff --git a/gcc/testsuite/g++.dg/parse/error37.C b/gcc/testsuite/g++.dg/parse/error37.C new file mode 100644 index 000000000..309912647 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error37.C @@ -0,0 +1,5 @@ +/* PR c++/42054 */ +/* { dg-do compile } */ + +template<int int> struct A; /* { dg-error "two or more" } */ +template<int int> struct A; /* { dg-error "two or more" } */ diff --git a/gcc/testsuite/g++.dg/parse/error4.C b/gcc/testsuite/g++.dg/parse/error4.C new file mode 100644 index 000000000..792bf4dc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error4.C @@ -0,0 +1,10 @@ +// PR c++/12160 +// { dg-options "-fshow-column" } + +struct X { + virtual void f(int, + itn, + int); +}; + +// { dg-error "4:'itn' has not been declared" "" { target *-*-* } 6 } diff --git a/gcc/testsuite/g++.dg/parse/error5.C b/gcc/testsuite/g++.dg/parse/error5.C new file mode 100644 index 000000000..eb1f9c730 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error5.C @@ -0,0 +1,19 @@ +// PR c++/13269 +// { dg-options "-fshow-column" } + +class Foo { int foo() return 0; } }; + +// { dg-error "30:expected identifier before numeric constant" "identifier" { target *-*-* } 4 } + +// { dg-error "23:named return values are no longer supported" "named return" { target *-*-* } 4 } + +// the column number info of this error output is still wrong because the error +// message has been generated by cp_parser_error() which does not +// necessarily allow accurate column number display. At some point, we will +// need make cp_parser_error() report more accurate column numbers. +// { dg-error "30:expected '\{' at end of input" "brace" { target *-*-* } 4 } + +// { dg-error "33:expected ';' after class definition" "semicolon" {target *-*-* } 4 } + +// { dg-error "35:expected declaration before '\}' token" "declaration" {target *-*-* } 4 } + diff --git a/gcc/testsuite/g++.dg/parse/error6.C b/gcc/testsuite/g++.dg/parse/error6.C new file mode 100644 index 000000000..8b8424fe3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error6.C @@ -0,0 +1,11 @@ +// PR c++/10603 +// { dg-options "-fshow-column" } + +int f(int not) { + return 1-not; +} + +// { dg-error "11:expected ',' or '...' before 'not' token" "" { target *-*-* } 4 } + +// { dg-error "15:expected primary\\-expression before ';' token" "" { target *-*-* } 5 } + diff --git a/gcc/testsuite/g++.dg/parse/error7.C b/gcc/testsuite/g++.dg/parse/error7.C new file mode 100644 index 000000000..78b7caac9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error7.C @@ -0,0 +1,7 @@ +// PR c++/12827 +// { dg-options "-fshow-column" } + +void f(int x + int y); + +// { dg-error "8:expected ',' or '...' before 'int'" "" { target *-*-* } 5 } diff --git a/gcc/testsuite/g++.dg/parse/error8.C b/gcc/testsuite/g++.dg/parse/error8.C new file mode 100644 index 000000000..6d3bf5a85 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error8.C @@ -0,0 +1,9 @@ +// PR c++/13438 +// { dg-options "-fshow-column" } + +struct A { friend typename struct B; }; + + +// { dg-error "28:expected nested-name-specifier before 'struct'" "" { target *-*-* } 4 } +// { dg-error "35:multiple types in one declaration" "" { target *-*-* } 4 } +// { dg-error "12:friend declaration does not name a class or function" "" { target *-*-* } 4 } diff --git a/gcc/testsuite/g++.dg/parse/error9.C b/gcc/testsuite/g++.dg/parse/error9.C new file mode 100644 index 000000000..b16c84e81 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error9.C @@ -0,0 +1,9 @@ +// PR c++/12613 +// { dg-options "-fshow-column" } + +enum { FOO = 1, BAR = 2 }; +int a[] = { FOO: 1, BAR: 2 }; + +// the following 2 column locations are still not accurate enough +// { dg-error "28:name 'FOO' used in a GNU-style designated initializer for an array" "" { target *-*-* } 5 } +// { dg-error "28:name 'BAR' used in a GNU-style designated initializer for an array" "" { target *-*-* } 5 } diff --git a/gcc/testsuite/g++.dg/parse/explicit1.C b/gcc/testsuite/g++.dg/parse/explicit1.C new file mode 100644 index 000000000..35358749e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/explicit1.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Origin: stefaandr@hotmail.com + +// PR c++/12403: ICE when explicit specialization is not in +// namespace scope. + +struct foo { + template<typename T> void bar (T &t) {} + template<> void bar<double>(double &t) {} // { dg-error "non-namespace|template|function" } +}; diff --git a/gcc/testsuite/g++.dg/parse/expr1.C b/gcc/testsuite/g++.dg/parse/expr1.C new file mode 100644 index 000000000..2ef82185b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/expr1.C @@ -0,0 +1,8 @@ +struct A { + A (int, int); + void f (); +}; + +void f (int a) { + A (a, a).f (); +} diff --git a/gcc/testsuite/g++.dg/parse/expr2.C b/gcc/testsuite/g++.dg/parse/expr2.C new file mode 100644 index 000000000..32800e4f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/expr2.C @@ -0,0 +1,8 @@ +struct X { + X(double *data, double d0, double d1); +}; + +int foo(double d0) { + double * data; + X(data,d0,d0); +} diff --git a/gcc/testsuite/g++.dg/parse/expr3.C b/gcc/testsuite/g++.dg/parse/expr3.C new file mode 100644 index 000000000..95d332f41 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/expr3.C @@ -0,0 +1,32 @@ +/* { dg-do compile } */ +/* PR/18047 Test that operators have the right precedence. */ +/* by bonzini@gnu.org */ + +#define test(lower, higher, a, b, c, d) \ + test_(lower, higher, a, b, c, d, __LINE__) + +#define test_(lower, higher, a, b, c, d, line)\ + test__(lower, higher, a, b, c, d, line) + +/* The first declaration tests that the parentheses are added correctly + by the expression parser. The second tests that the two possible + orderings of precedences do give different results. */ +#define test__(lower, higher, a, b, c, d, line) \ + char test##line[ \ + (a higher b lower c higher d) == \ + ((a higher b) lower (c higher d)) \ + ? 1 : -1]; \ + char doublecheck##line[ \ + (a higher b lower c higher d) == \ + (a higher (b lower c) higher d) \ + ? -1 : 1]; + +test (||, &&, 1, 1, 0, 0) +test (&&, |, 5, 1, 1, 19) +test (|, ^, 1, 2, 2, 1) +test (^, &, 1, 3, 2, 6) +test (&, ==, 1, 3, 2, 0) +test (==, <, 2, 0, 0, 0) +test (<, <<, 2, 3, 6, 8) +test (<<, +, 2, 3, 4, 5) +test (+, *, 2, 6, 9, 13) diff --git a/gcc/testsuite/g++.dg/parse/extern-C-1.C b/gcc/testsuite/g++.dg/parse/extern-C-1.C new file mode 100644 index 000000000..60a634832 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/extern-C-1.C @@ -0,0 +1,13 @@ +/* PR c++/4754 */ +/* { dg-do compile } */ +// GCC 3.2 got very confused by the nested extern "C" blocks, and thought +// there was a storage class specifier on 'int i'. + +extern "C" +{ + extern "C" struct Test + { + int i; + }; +} + diff --git a/gcc/testsuite/g++.dg/parse/extern1.C b/gcc/testsuite/g++.dg/parse/extern1.C new file mode 100644 index 000000000..cc95fa694 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/extern1.C @@ -0,0 +1,14 @@ +// PR c++/21495 +// { dg-do compile } + +class A +{ + extern void *copy (void) // { dg-error "storage class specified" } + { + return 0; + } + extern A &operator= (const A &) // { dg-error "storage class specified" } + { + return *this; + } +}; diff --git a/gcc/testsuite/g++.dg/parse/fn-typedef1.C b/gcc/testsuite/g++.dg/parse/fn-typedef1.C new file mode 100644 index 000000000..ebdc012f5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/fn-typedef1.C @@ -0,0 +1,19 @@ +// PR c++/40750 +// { dg-do run } + +extern "C" void abort (); + +typedef void Fn() const; + +struct Foo { + Fn fn; +}; + +bool called = false; +void Foo::fn() const { called = true; } + +int main() { + Foo f; f.fn(); + if (!called) + abort(); +} diff --git a/gcc/testsuite/g++.dg/parse/fn-typedef2.C b/gcc/testsuite/g++.dg/parse/fn-typedef2.C new file mode 100644 index 000000000..c9c7f060d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/fn-typedef2.C @@ -0,0 +1,7 @@ +// Test that merge_types preserves fn cv-quals. + +typedef void ft() const; +typedef void V; +typedef V ft() const; + +ft f; // { dg-error "qualified" } diff --git a/gcc/testsuite/g++.dg/parse/for1.C b/gcc/testsuite/g++.dg/parse/for1.C new file mode 100644 index 000000000..1e310ee02 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/for1.C @@ -0,0 +1,7 @@ +// PR c++/23440 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } +// { dg-options "" } + +# 0 "for1.C" +void foo() { for (;;) // { dg-error "at end of input" "" { target *-*-* } 0 } diff --git a/gcc/testsuite/g++.dg/parse/friend1.C b/gcc/testsuite/g++.dg/parse/friend1.C new file mode 100644 index 000000000..f19dc9c62 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend1.C @@ -0,0 +1,9 @@ +namespace N { + template <typename T> + static void f (); + + struct S { + friend void N::f<int> (); + static void f (int); + }; +} diff --git a/gcc/testsuite/g++.dg/parse/friend2.C b/gcc/testsuite/g++.dg/parse/friend2.C new file mode 100644 index 000000000..1a2ad8bfa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend2.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// Origin: <struppi@acm.org> + +// PR c++/8591 +// Template or class detection in friend declaration + +namespace NS { + template <class T1, class T2, class T3 = int, class T4 = int> + struct C {}; +} + +template <class T> class X { + friend class NS::C; // { dg-error "template|friend" } +}; + +X<int> c; diff --git a/gcc/testsuite/g++.dg/parse/friend3.C b/gcc/testsuite/g++.dg/parse/friend3.C new file mode 100644 index 000000000..39322021e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend3.C @@ -0,0 +1,10 @@ +// { dg-do compile } +// +// PR 11553 catch duplicate friend specifiers + +struct S +{ + friend friend class C; // { dg-error "duplicate" } +}; + + diff --git a/gcc/testsuite/g++.dg/parse/friend4.C b/gcc/testsuite/g++.dg/parse/friend4.C new file mode 100644 index 000000000..5eca512e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend4.C @@ -0,0 +1,8 @@ +// { dg-do compile } + +// PR c++/4100 +// You can't use friend when defining a class. + +class A { + friend class B { }; // { dg-error "friend" } +}; diff --git a/gcc/testsuite/g++.dg/parse/friend5.C b/gcc/testsuite/g++.dg/parse/friend5.C new file mode 100644 index 000000000..ec134c26e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend5.C @@ -0,0 +1,8 @@ +// PR c++/23694 + +extern "C" struct A +{ + friend void foo(int) {} // { dg-error "declaration" } + friend void foo() {} // { dg-error "foo" "err" } + // { dg-warning "already a friend" "warn" { target *-*-* } 6 } +}; diff --git a/gcc/testsuite/g++.dg/parse/friend6.C b/gcc/testsuite/g++.dg/parse/friend6.C new file mode 100644 index 000000000..2d13606cb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend6.C @@ -0,0 +1,3 @@ +// PR c++/27808 + +template<typename T> friend void T::foo; // { dg-error "friend|invalid" } diff --git a/gcc/testsuite/g++.dg/parse/friend7.C b/gcc/testsuite/g++.dg/parse/friend7.C new file mode 100644 index 000000000..668fd35d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend7.C @@ -0,0 +1,37 @@ +// PR c++/34488 +// { dg-do compile } + +struct A +{ + A (); + ~A (); + A (const A &); +}; + +struct B +{ + friend A::A (); + friend A::~A (); + friend A::A (const A &); +}; + +struct C +{ + friend int C (); // { dg-error "return type|in friend decl" } + friend int ~C (); // { dg-error "return type|in friend decl" } + friend int C (const C &); // { dg-error "return type|in friend decl" } +}; + +struct D +{ + friend int D () {} // { dg-error "return type|in friend decl" } + friend int ~D () {} // { dg-error "return type|in friend decl" } + friend int D (const D &) {} // { dg-error "return type|in friend decl" } +}; + +struct E +{ + friend A::A () {} // { dg-error "cannot define member" } + friend A::~A () {} // { dg-error "cannot define member" } + friend A::A (const A &) {} // { dg-error "cannot define member" } +}; diff --git a/gcc/testsuite/g++.dg/parse/friend8.C b/gcc/testsuite/g++.dg/parse/friend8.C new file mode 100644 index 000000000..aac5f0e55 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/friend8.C @@ -0,0 +1,8 @@ +// PR c++/35578 +// Check position of error message +// { dg-do compile } + +int i; + +friend // { dg-error "friend" } + void foo(); diff --git a/gcc/testsuite/g++.dg/parse/func-def1.C b/gcc/testsuite/g++.dg/parse/func-def1.C new file mode 100644 index 000000000..00c973d88 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/func-def1.C @@ -0,0 +1,11 @@ +// PR c++/7917 +// Origin: VACLAV HAISMAN <V.Haisman@sh.cvut.cz> +// { dg-do compile } + +struct A +{ + int i; + void foo() = 0 {} // { dg-error "" } + + A() : i(0) {} +}; diff --git a/gcc/testsuite/g++.dg/parse/funptr1.C b/gcc/testsuite/g++.dg/parse/funptr1.C new file mode 100644 index 000000000..bf63c122e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/funptr1.C @@ -0,0 +1,13 @@ +// PR c++/9282 +// Origin: Thomas Richter <thor@math.tu-berlin.de> +// { dg-do compile } + +typedef void (*fptr)(); + +struct A +{ + template<int> static void foo() {} + template<fptr f> static void bar() { (*f)(); } +}; + +fptr f = A::bar< A::foo<0> >; diff --git a/gcc/testsuite/g++.dg/parse/fused-params1.C b/gcc/testsuite/g++.dg/parse/fused-params1.C new file mode 100644 index 000000000..33732fc28 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/fused-params1.C @@ -0,0 +1,12 @@ +// PR c++/8785 +// Origin: Alexander Zvyagin <Alexander.Zviagine@cern.ch> +// { dg-do compile } + +template <int N,typename T> struct A // { dg-error "" } +{ + typedef T X; + template <int M> void foo (const A<M,X>&); +}; + +template <int N,int M,typename T> +void A<N,T>::foo (const A<M,X>&) {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/inline1.C b/gcc/testsuite/g++.dg/parse/inline1.C new file mode 100644 index 000000000..5c3034c6e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/inline1.C @@ -0,0 +1,7 @@ +struct f +{ + int oo() + { + return (2; // { dg-error "" } + } +}; diff --git a/gcc/testsuite/g++.dg/parse/int-as-enum1.C b/gcc/testsuite/g++.dg/parse/int-as-enum1.C new file mode 100644 index 000000000..7c37eb087 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/int-as-enum1.C @@ -0,0 +1,6 @@ +// PR c++/4207 +// Origin: <wanderer@rsu.ru> +// { dg-do compile } + +typedef int A; // { dg-error "previous" } +enum ::A {}; // { dg-error "typedef-name|expected unqualified-id" } diff --git a/gcc/testsuite/g++.dg/parse/invalid-op1.C b/gcc/testsuite/g++.dg/parse/invalid-op1.C new file mode 100644 index 000000000..0b75d0791 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/invalid-op1.C @@ -0,0 +1,14 @@ +// PR c++/10150 +// Origin: Tom Evans <te200@eng.cam.ac.uk> +// { dg-do compile } + +template <int I> struct A +{ + template <int> struct B + { + enum { e = I * A<I-1>::B }; // { dg-error "dependent-name" "depname" } + // { dg-message "note" "note" { target *-*-* } 9 } + }; +}; + +A<0>::B<0> a; // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/parse/limits-initializer1.C b/gcc/testsuite/g++.dg/parse/limits-initializer1.C new file mode 100644 index 000000000..4b507912f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/limits-initializer1.C @@ -0,0 +1,37 @@ +// PR middle-end/42803 +// { dg-do compile } +// { dg-options "-O0" } + +#define X2 (a + a) +#define X4 (X2 + X2) +#define X8 (X4 + X4) +#define X16 (X8 + X8) +#define X32 (X16 + X16) +#define X64 (X32 + X32) +#define X128 (X64 + X64) +#define X256 (X128 + X128) +#define X512 (X256 + X256) +#define X1024 (X512 + X512) +#define X2048 (X1024 + X1024) +#define X4096 (X2048 + X2048) +#define X8192 (X4096 + X4096) +#define X16384 (X8192 + X8192) +#define X32768 (X16384 + X16384) +#define X65536 (X32768 + X32768) +#define X131072 (X65536 + X65536) +#define X262144 (X131072 + X131072) + +int +foo (int a) +{ + int v = X262144; + return v; +} + +// Emit an error to just make sure we don't waste too much time +// in the middle-end compiling this. +int +bar (void) +{ + return x; // { dg-error "was not declared in this scope" } +} diff --git a/gcc/testsuite/g++.dg/parse/linkage1.C b/gcc/testsuite/g++.dg/parse/linkage1.C new file mode 100644 index 000000000..4a0d8942e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/linkage1.C @@ -0,0 +1,11 @@ +// PR c++/26068 + +extern "C" auto int a; // { dg-error "linkage" } +extern "C" register int b; // { dg-error "linkage" } +extern "C" static void c(); // { dg-error "linkage" } +extern "C" extern void d(); // { dg-error "linkage" } +extern "C" mutable int e; // { dg-error "linkage" } + +extern "C" { + static void f(); +} diff --git a/gcc/testsuite/g++.dg/parse/linkage2.C b/gcc/testsuite/g++.dg/parse/linkage2.C new file mode 100644 index 000000000..aa204df2a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/linkage2.C @@ -0,0 +1,3 @@ +// PR c++/27884 + +extern "C" void foo(register int *my_perl); diff --git a/gcc/testsuite/g++.dg/parse/linkage3.C b/gcc/testsuite/g++.dg/parse/linkage3.C new file mode 100644 index 000000000..0d952d1e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/linkage3.C @@ -0,0 +1,7 @@ +// PR c++/37877 +// { dg-do compile } + +extern "C++" struct S +{ + static int x; +} s; diff --git a/gcc/testsuite/g++.dg/parse/local-class1.C b/gcc/testsuite/g++.dg/parse/local-class1.C new file mode 100644 index 000000000..518dd7abd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/local-class1.C @@ -0,0 +1,14 @@ + // Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Feb 2005 <nathan@codesourcery.com> + +// Origin: Jorn Wolfgang Rennecke <amylaar@gcc.gnu.org> +// Bug 19608: ICE on invalid + + +void f () +{ + class c + { + friend void g () { } // { dg-error "local class" "" } + }; +} diff --git a/gcc/testsuite/g++.dg/parse/local1.C b/gcc/testsuite/g++.dg/parse/local1.C new file mode 100644 index 000000000..cfcffc908 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/local1.C @@ -0,0 +1,18 @@ +// PR c++/28056 + +void f1(); + +namespace N { + void f2(); +} + +class C { + static void f3(); +}; + +void foo() { + void ::f1(); // { dg-error "qualified" } + void N::f2(); // { dg-error "qualified" } + void C::f3(); // { dg-error "qualified" } + void ::f4(); // { dg-error "qualified" } +} diff --git a/gcc/testsuite/g++.dg/parse/long1.C b/gcc/testsuite/g++.dg/parse/long1.C new file mode 100644 index 000000000..c22d79117 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/long1.C @@ -0,0 +1,11 @@ +// PR c++/6634 +// { dg-do compile } +// { dg-options "" } + +long long double x; // { dg-error "long long" } +long double y; +long float z; // { dg-error "long" } + +typedef short void SV; // { dg-error "short" } +typedef long struct A LA; // { dg-error "long" } +typedef short char SC; // { dg-error "short" } diff --git a/gcc/testsuite/g++.dg/parse/lookup1.C b/gcc/testsuite/g++.dg/parse/lookup1.C new file mode 100644 index 000000000..0325d3c69 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup1.C @@ -0,0 +1,9 @@ +#include <list> + +using namespace std; + +template <class T, class Alloc> +class new_list : public list<T, Alloc> { +public: + typedef typename list<T, Alloc>::iterator iterator; +}; diff --git a/gcc/testsuite/g++.dg/parse/lookup2.C b/gcc/testsuite/g++.dg/parse/lookup2.C new file mode 100644 index 000000000..fcf17cde4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup2.C @@ -0,0 +1,21 @@ +template <typename T> struct A +{ + typedef int X; +}; + +template <typename T> struct B +{ + typename A<T>::X x; +}; + +template <typename T> struct C +{ + void foo(int); + B<A<T>*> b; +}; + +template <typename T> struct D +{ + enum { e }; + void bar() { C<T*>::foo(e); } +}; diff --git a/gcc/testsuite/g++.dg/parse/lookup3.C b/gcc/testsuite/g++.dg/parse/lookup3.C new file mode 100644 index 000000000..d4bf79830 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup3.C @@ -0,0 +1,12 @@ +struct X {}; + +template <int> +struct Base { + static void foo () { + X::NONEXISTENT (); // { dg-error "" } + } +}; + +int main () { + Base<2>::foo (); +} diff --git a/gcc/testsuite/g++.dg/parse/lookup4.C b/gcc/testsuite/g++.dg/parse/lookup4.C new file mode 100644 index 000000000..01e5662ad --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup4.C @@ -0,0 +1,7 @@ +// PR c++/16637 + +typedef int I; + +struct S { + ::I I; +}; diff --git a/gcc/testsuite/g++.dg/parse/lookup5.C b/gcc/testsuite/g++.dg/parse/lookup5.C new file mode 100644 index 000000000..afdf023b5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/lookup5.C @@ -0,0 +1,26 @@ +// { dg-do compile } + +struct A {}; + +template <class T> struct B +{ + T a, b; + B() {} + B(T x, T y) : a(x), b(y) {} + template <class U> operator B<U> () const + { return B<U>((U)(this->a), (U)(this->b)); } +}; + +template <class T> struct C : public B<int> +{ + T *c; + inline T & operator *() { return *c; } +}; + +template <class T> struct D : virtual public C<T> { }; + +void +foo (D<A> x) +{ + *x; +} diff --git a/gcc/testsuite/g++.dg/parse/memfnquals1.C b/gcc/testsuite/g++.dg/parse/memfnquals1.C new file mode 100644 index 000000000..ce8af7b72 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/memfnquals1.C @@ -0,0 +1,6 @@ +// PR c++/48166 + +struct foo { + static void func (); +}; +void foo::func () const {} // { dg-error "type qualifiers" } diff --git a/gcc/testsuite/g++.dg/parse/missing-template1.C b/gcc/testsuite/g++.dg/parse/missing-template1.C new file mode 100644 index 000000000..e5e03146d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/missing-template1.C @@ -0,0 +1,23 @@ +// PR c++/8736 +// Origin: Peter Kolloch <pkolloch@gmx.ne> +// { dg-do compile } + +template <typename T> struct A +{ + template <typename U> struct B + { + typedef int X; + }; +}; + +template <typename T> void foo() +{ + typedef typename A<T>::B<T>::X Y; // { dg-error "non-template" "non" } + // { dg-error "not declare" "decl" { target *-*-* } 15 } + // { dg-message "note" "note" { target *-*-* } 15 } +} + +void bar() +{ + foo<int>(); +} diff --git a/gcc/testsuite/g++.dg/parse/mutable1.C b/gcc/testsuite/g++.dg/parse/mutable1.C new file mode 100644 index 000000000..f3ac2e4a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/mutable1.C @@ -0,0 +1,7 @@ +// PR c++/16518 + +struct foo { + void bar() const { m1=1; m2=1;} + mutable int m1,m2; +}; + diff --git a/gcc/testsuite/g++.dg/parse/named_ops.C b/gcc/testsuite/g++.dg/parse/named_ops.C new file mode 100644 index 000000000..80e514992 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/named_ops.C @@ -0,0 +1,13 @@ +/* Copyright (C) 2002 Free Software Foundation, Inc. */ + +/* { dg-do compile } */ +/* { dg-options -fpreprocessed } */ + +/* Tests that C++ named ops are still there with -fpreprocessed. */ + +/* Source: Neil Booth, 23 May 2002. */ + +int main () +{ + return 2 xor 2; +} diff --git a/gcc/testsuite/g++.dg/parse/namespace-definition.C b/gcc/testsuite/g++.dg/parse/namespace-definition.C new file mode 100644 index 000000000..b7d4034cd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace-definition.C @@ -0,0 +1,10 @@ +// PR 30891 +// { dg-do compile } + +int main() { + int i = 0; + namespace foo { // { dg-error "'namespace' definition is not allowed here" } + int j = 0; + } + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/namespace1.C b/gcc/testsuite/g++.dg/parse/namespace1.C new file mode 100644 index 000000000..7740bce2d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace1.C @@ -0,0 +1,7 @@ +namespace foo { +void baz(int); +} + +int bar(int foo) { + foo::baz (3); +} diff --git a/gcc/testsuite/g++.dg/parse/namespace10.C b/gcc/testsuite/g++.dg/parse/namespace10.C new file mode 100644 index 000000000..9f93d1b68 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace10.C @@ -0,0 +1,9 @@ +// PR c++/16529 + +namespace m {} // { dg-error "" } + +namespace n { + namespace m {} +} + +namespace m = n::m; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/namespace11.C b/gcc/testsuite/g++.dg/parse/namespace11.C new file mode 100644 index 000000000..7fa73b6e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace11.C @@ -0,0 +1,7 @@ +// PR c++/43069 + +namespace std { + template < typename > + void swap (); +} +template std::swap // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/namespace12.C b/gcc/testsuite/g++.dg/parse/namespace12.C new file mode 100644 index 000000000..25d6ae093 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace12.C @@ -0,0 +1,7 @@ +// PR c++/43109 + +namespace std { + namespace { + struct S {}; + } +} diff --git a/gcc/testsuite/g++.dg/parse/namespace2.C b/gcc/testsuite/g++.dg/parse/namespace2.C new file mode 100644 index 000000000..a2c10e053 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace2.C @@ -0,0 +1,15 @@ +/* PR c++/2537 */ +/* { dg-do compile } */ + +// Used to have namespace name/identifier conflict, prior to 3.4. + +namespace baz {} + +namespace foo + { + struct bar + { + unsigned baz:1; + }; + } + diff --git a/gcc/testsuite/g++.dg/parse/namespace3.C b/gcc/testsuite/g++.dg/parse/namespace3.C new file mode 100644 index 000000000..4665d0e9e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace3.C @@ -0,0 +1,12 @@ +/* PR c+/3816 */ +/* { dg-do compile } */ +namespace A {} + +namespace OtherNamespace { + + typedef struct { + int member; + } A; // used to conflict with A namespace + +} // end of namespace + diff --git a/gcc/testsuite/g++.dg/parse/namespace4.C b/gcc/testsuite/g++.dg/parse/namespace4.C new file mode 100644 index 000000000..2bee8dda8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace4.C @@ -0,0 +1,18 @@ +/* PR c++/4652 */ +/* { dg-do compile } */ +/* Another conflict between namespace IDs and other things. */ + +namespace A { } + +class B { + + struct { + int x; + } A; + +}; + +int main() { + B b; + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/namespace5.C b/gcc/testsuite/g++.dg/parse/namespace5.C new file mode 100644 index 000000000..277c0c8e6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace5.C @@ -0,0 +1,5 @@ +// PR c++/7229 +// { dg-do compile } + +namespace A { namespace B { typedef int type; } } +typename A::B<0>::type x; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/namespace6.C b/gcc/testsuite/g++.dg/parse/namespace6.C new file mode 100644 index 000000000..06642d429 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace6.C @@ -0,0 +1,10 @@ +namespace a { + namespace b { + void foo(); + } +} + +void +a::b:foo() // { dg-error "" } +{ +} diff --git a/gcc/testsuite/g++.dg/parse/namespace7.C b/gcc/testsuite/g++.dg/parse/namespace7.C new file mode 100644 index 000000000..c8ac60882 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace7.C @@ -0,0 +1,8 @@ +namespace O { + struct SO; + namespace I { + struct SI; + struct O::SO {}; // { dg-error "" } + } + struct I::SI {}; +} diff --git a/gcc/testsuite/g++.dg/parse/namespace8.C b/gcc/testsuite/g++.dg/parse/namespace8.C new file mode 100644 index 000000000..d5a9b0ac1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace8.C @@ -0,0 +1,6 @@ +namespace X { + typedef struct { + } x; +} +typedef X::x x; +using X::x; diff --git a/gcc/testsuite/g++.dg/parse/namespace9.C b/gcc/testsuite/g++.dg/parse/namespace9.C new file mode 100644 index 000000000..7ff0267bf --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/namespace9.C @@ -0,0 +1,8 @@ +namespace A { + void f(); +} +int g() +{ + struct f { }; + using A::f; +} diff --git a/gcc/testsuite/g++.dg/parse/new1.C b/gcc/testsuite/g++.dg/parse/new1.C new file mode 100644 index 000000000..d61c44633 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/new1.C @@ -0,0 +1,7 @@ +struct T; // { dg-error "forward" } +T* manage(T* t); +template <class Obj> struct ObjectSlot0_ { + void create() { + void* tmp = manage(new T()); // { dg-error "incomplete" } + } +}; diff --git a/gcc/testsuite/g++.dg/parse/new2.C b/gcc/testsuite/g++.dg/parse/new2.C new file mode 100644 index 000000000..d233b68ca --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/new2.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// Contributed by David Daney <daney at gcc dot gnu dot org> +// PR c++/14181: Cryptic error message for ill-formed new expressions + +void f1(void) +{ + (void)new (char*)[10]; // { dg-error "parenthesized|parentheses" } + (void)new char*[10]; +} diff --git a/gcc/testsuite/g++.dg/parse/new3.C b/gcc/testsuite/g++.dg/parse/new3.C new file mode 100644 index 000000000..d8faed294 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/new3.C @@ -0,0 +1,4 @@ +// PR c++/28593 +// { dg-do compile } + +void *p = new (::X; // { dg-error "declared|type-specifier" } diff --git a/gcc/testsuite/g++.dg/parse/new4.C b/gcc/testsuite/g++.dg/parse/new4.C new file mode 100644 index 000000000..34bd23230 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/new4.C @@ -0,0 +1,7 @@ +// PR c++/29291 +// { dg-do compile } + +template<int> void foo() +{ + new int(; // { dg-error "before" } +} diff --git a/gcc/testsuite/g++.dg/parse/no-type-defn1.C b/gcc/testsuite/g++.dg/parse/no-type-defn1.C new file mode 100644 index 000000000..9e899579e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/no-type-defn1.C @@ -0,0 +1,5 @@ +// PR c++/47144 + +template<typename> struct A { }; +A< struct B { }* >::SomeNonSense // { dg-error "types may not be defined" } +int y; diff --git a/gcc/testsuite/g++.dg/parse/no-typename1.C b/gcc/testsuite/g++.dg/parse/no-typename1.C new file mode 100644 index 000000000..42059ce7b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/no-typename1.C @@ -0,0 +1,11 @@ +// PR c++/4903 +// Origin: Dan Marinescu <theverylittleone@hotmail.com> +// { dg-do compile } + +template <typename T> struct A +{ + template <typename U> struct B + { + A<T>::template B<U> foo(); // { dg-error "" } + }; +}; diff --git a/gcc/testsuite/g++.dg/parse/no-value1.C b/gcc/testsuite/g++.dg/parse/no-value1.C new file mode 100644 index 000000000..443a389ce --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/no-value1.C @@ -0,0 +1,14 @@ +// PR c++/5533 +// { dg-do compile } + +namespace N +{ + template <class T> struct A{}; +} + +template <class T> void foo(T) {} + +void bar() +{ + foo(N::A); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/non-dependent1.C b/gcc/testsuite/g++.dg/parse/non-dependent1.C new file mode 100644 index 000000000..d85ecb13a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/non-dependent1.C @@ -0,0 +1,19 @@ +// PR c++/8921 +// Origin: Chin-Lung Chang <evirt@iis.sinica.edu.tw> +// { dg-do compile } + +struct A +{ + template <typename T> void foo(); +}; + +template <typename T> void bar(A& a) +{ + a.foo<T>(); +} + +void baz() +{ + A a; + bar<int>(a); +} diff --git a/gcc/testsuite/g++.dg/parse/non-dependent2.C b/gcc/testsuite/g++.dg/parse/non-dependent2.C new file mode 100644 index 000000000..4df2da7fa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/non-dependent2.C @@ -0,0 +1,37 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 16 Jul 2003 <nathan@codesourcery.com> + +// A non-dependent field_decl can bind at parse time. + +template <class T> +struct Foo { + int j; // we never see this one. + int k; // { dg-error "Foo" "" } + +}; + +struct Baz +{ + int j; + int k; // { dg-error "candidates" "" } + +}; + +template <class T> +struct Bar : public Foo<T>, Baz { + + int baz () { return j; } // binds to Baz::j + int foo () { return this->k; } // { dg-error "request for member" "" } +}; + +int main() +{ + Bar<int> bar; + + bar.baz (); + bar.foo (); // { dg-message "instantiated" "" } + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/non-dependent3.C b/gcc/testsuite/g++.dg/parse/non-dependent3.C new file mode 100644 index 000000000..9dfb99636 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/non-dependent3.C @@ -0,0 +1,17 @@ +// PR c++/14586 + +enum E { e }; + +E & operator |= (E &f1, const E &f2); + +E operator | (const E &f1, const E &f2) { + E result = f1; + result |= f2; + return result; +} + +template <typename> void foo () { + const E flags = e | e; +} + +template void foo<double> (); diff --git a/gcc/testsuite/g++.dg/parse/non-templ1.C b/gcc/testsuite/g++.dg/parse/non-templ1.C new file mode 100644 index 000000000..07bb3793a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/non-templ1.C @@ -0,0 +1,10 @@ +// PR c++/9228 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +struct A +{ + struct B { B(int); }; +}; + +template <typename T> typename A<T>::B foo() { return 1; } // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/nontype1.C b/gcc/testsuite/g++.dg/parse/nontype1.C new file mode 100644 index 000000000..e721700af --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/nontype1.C @@ -0,0 +1,9 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> +// { dg-do compile } + +// PR c++/13289: Incorrectly reject non-type template argument that has +// dependent type + +template <class T, T t> class C {}; +template <class T, T t> class D { C<T, t-1> c; }; diff --git a/gcc/testsuite/g++.dg/parse/octal1.C b/gcc/testsuite/g++.dg/parse/octal1.C new file mode 100644 index 000000000..8d62eef3c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/octal1.C @@ -0,0 +1 @@ +int i = 08; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/offsetof1.C b/gcc/testsuite/g++.dg/parse/offsetof1.C new file mode 100644 index 000000000..ae9d3110a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof1.C @@ -0,0 +1,11 @@ +#include <stddef.h> + +template <bool> struct StaticAssert; +template <> struct StaticAssert<true> {}; + +struct MyPOD +{ + int a; int b; int c; +}; + +StaticAssert<(offsetof(MyPOD, a) == 0)> s; diff --git a/gcc/testsuite/g++.dg/parse/offsetof2.C b/gcc/testsuite/g++.dg/parse/offsetof2.C new file mode 100644 index 000000000..4552d39fe --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof2.C @@ -0,0 +1,12 @@ +#include <cstddef> + +struct choke_me +{ + int size; + char storage[1]; +}; + +struct offset_is_broken +{ + static const int offset = offsetof(choke_me, storage); +}; diff --git a/gcc/testsuite/g++.dg/parse/offsetof3.C b/gcc/testsuite/g++.dg/parse/offsetof3.C new file mode 100644 index 000000000..905e5f58a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof3.C @@ -0,0 +1,11 @@ +// PR c++/13529 + +#include <cstddef> + +struct A { int i; }; +struct B { A a; }; + +int main() +{ + return offsetof(B,a.i) != 0; +} diff --git a/gcc/testsuite/g++.dg/parse/offsetof4.C b/gcc/testsuite/g++.dg/parse/offsetof4.C new file mode 100644 index 000000000..ba051480d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof4.C @@ -0,0 +1,13 @@ +// { dg-do compile } +// Contributed by Bill Helfinstine <bhelf at flitterfly dot whirpon dot com> +// PR c++/14932: Allow subscript operator in offsetof + +#include <cstddef> + +struct A +{ + int bar; + int foo[22]; +}; + +const int off = offsetof(A, foo[12]); diff --git a/gcc/testsuite/g++.dg/parse/offsetof5.C b/gcc/testsuite/g++.dg/parse/offsetof5.C new file mode 100644 index 000000000..553e33ded --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof5.C @@ -0,0 +1,13 @@ +// PR c++/16618 + +#include <stddef.h> + +struct test +{ + const char a; +}; + +int main() +{ + offsetof(test,a); +} diff --git a/gcc/testsuite/g++.dg/parse/offsetof6.C b/gcc/testsuite/g++.dg/parse/offsetof6.C new file mode 100644 index 000000000..0e07a5380 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof6.C @@ -0,0 +1,19 @@ +/* { dg-do compile } */ + +// From PR28573 + +struct A +{ + char d[44]; + char &operator [] ( int indx ) { return d[indx]; } +}; + +struct B +{ + A a; +}; + +int main() +{ + return __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply.*offsetof" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/offsetof7.C b/gcc/testsuite/g++.dg/parse/offsetof7.C new file mode 100644 index 000000000..113a79547 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof7.C @@ -0,0 +1,18 @@ +/* { dg-do compile } */ + +// From PR28573 + +struct A +{ + int operator [] ( int indx ) { return indx; } +}; + +struct B +{ + A a; +}; + +int main() +{ + return __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply.*offsetof" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/offsetof8.C b/gcc/testsuite/g++.dg/parse/offsetof8.C new file mode 100644 index 000000000..e613ddcbb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof8.C @@ -0,0 +1,16 @@ +// PR c++/35321 + +struct A +{ + A operator[] (int); +}; + +struct B +{ + A a; +}; + +void foo() +{ + __builtin_offsetof(B, a[0]); /* { dg-error "cannot apply 'offsetof' when 'operator\\\[\\\]' is overloaded" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/offsetof9.C b/gcc/testsuite/g++.dg/parse/offsetof9.C new file mode 100644 index 000000000..efc103837 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/offsetof9.C @@ -0,0 +1,32 @@ +/* PR c/32041 */ +/* { dg-do run } */ + +struct S +{ + int c; + struct { float f; } sa[2]; +}; + +char a[__builtin_offsetof (S, sa->f) + == __builtin_offsetof (S, sa[0].f) ? 1 : -1]; + +template <int N> +struct T +{ + int c[N]; + struct { float f; } sa[N]; + static int foo () { return __builtin_offsetof (T, sa->f); } + static int bar () { return __builtin_offsetof (T, sa[0].f); } +}; + +char b[__builtin_offsetof (T<5>, sa->f) + == __builtin_offsetof (T<5>, sa[0].f) ? 1 : -1]; + +int +main () +{ + if (T<1>::foo () != T<1>::bar ()) + __builtin_abort (); + if (T<7>::foo () != T<7>::bar ()) + __builtin_abort (); +} diff --git a/gcc/testsuite/g++.dg/parse/operator1.C b/gcc/testsuite/g++.dg/parse/operator1.C new file mode 100644 index 000000000..3a534d182 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator1.C @@ -0,0 +1,11 @@ +/* PR c++/8982 */ +/* { dg-do compile } */ +namespace foo { + template<class X> + int operator- (X x); +} + +int main() { + using foo::operator-; // syntax error under gcc 3.2 +} + diff --git a/gcc/testsuite/g++.dg/parse/operator2.C b/gcc/testsuite/g++.dg/parse/operator2.C new file mode 100644 index 000000000..a9ebde0d4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator2.C @@ -0,0 +1,15 @@ +// PR c++/7906 +// Origin: Marcel Loose <loose@astron.nl> +// { dg-do compile } + +template <typename> struct A { typedef int X; }; + +template <typename T> struct B +{ + typedef A<T> Y; + struct C { operator typename Y::X() const; }; +}; + +template <typename T> B<T>::C::operator typename B<T>::Y::X() const { return 0; } + +B<int> b; diff --git a/gcc/testsuite/g++.dg/parse/operator3.C b/gcc/testsuite/g++.dg/parse/operator3.C new file mode 100644 index 000000000..08f5c83f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator3.C @@ -0,0 +1,11 @@ +// PR c++/9454 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <int> struct A +{ + struct B { operator int (); }; + struct C : B { operator int (); }; +}; + +A<0> a; diff --git a/gcc/testsuite/g++.dg/parse/operator4.C b/gcc/testsuite/g++.dg/parse/operator4.C new file mode 100644 index 000000000..054ddc835 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator4.C @@ -0,0 +1 @@ +int operator *(int, ...); // { dg-error "class|variable number of arguments" } diff --git a/gcc/testsuite/g++.dg/parse/operator5.C b/gcc/testsuite/g++.dg/parse/operator5.C new file mode 100644 index 000000000..3e453bdf3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator5.C @@ -0,0 +1,7 @@ +// PR c++/17685 + +struct S { + operator int; // { dg-error "" } + operator void; // { dg-error "" } +}; + diff --git a/gcc/testsuite/g++.dg/parse/operator6.C b/gcc/testsuite/g++.dg/parse/operator6.C new file mode 100644 index 000000000..e58a3a682 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator6.C @@ -0,0 +1,5 @@ +// PR c++/25635 + +struct A {}; + +A::operator int(); // { dg-error "class" } diff --git a/gcc/testsuite/g++.dg/parse/operator7.C b/gcc/testsuite/g++.dg/parse/operator7.C new file mode 100644 index 000000000..e3464f017 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/operator7.C @@ -0,0 +1,4 @@ +// PR c++/27278 +// { dg-do compile } + +int operator+(void,void); // { dg-error "incomplete type|invalid use" } diff --git a/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C b/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C new file mode 100644 index 000000000..22d6f214d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parameter-declaration-1.C @@ -0,0 +1,6 @@ +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net> +// Origin: Robert Schiele; PR C++/8799 +// { dg-do compile } + +struct { + a(void = 0; a(0), a(0) // { dg-error "" "" { target *-*-* } } diff --git a/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C b/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C new file mode 100644 index 000000000..7a9a24fb7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parameter-declaration-2.C @@ -0,0 +1 @@ +void f (int i, int p[i]); // { dg-error "use of parameter .i. outside function body" } diff --git a/gcc/testsuite/g++.dg/parse/parens1.C b/gcc/testsuite/g++.dg/parse/parens1.C new file mode 100644 index 000000000..f63f50143 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parens1.C @@ -0,0 +1,18 @@ +/* PR c++/8237 */ +/* { dg-do compile } */ +class A { +public: + A() { } +}; + +class B { +public: + B(A a) { } + void form() { } +}; + +int main() { + // This used to give a parse error. + B(A()).form(); +} + diff --git a/gcc/testsuite/g++.dg/parse/parens2.C b/gcc/testsuite/g++.dg/parse/parens2.C new file mode 100644 index 000000000..636dd8df3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parens2.C @@ -0,0 +1,11 @@ +/* PR c++/8842. */ +/* { dg-do compile } */ +int main( int argc, char* argv[] ) +{ + int i = 5; + // This always worked: + // double l1 = double(int(i)) / double(int(i)); + // But this used to give a parse error before the `/' token: + double l2 = (double(int(i)) / double(int(i))); +} + diff --git a/gcc/testsuite/g++.dg/parse/parse1.C b/gcc/testsuite/g++.dg/parse/parse1.C new file mode 100644 index 000000000..cbac6da15 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse1.C @@ -0,0 +1,9 @@ +/* PR c++/50 */ +/* { dg-do compile } */ + +namespace A {typedef int Z;} +int main(void) +{ + A::Z* z; + z->A::Z::~Z(); +} diff --git a/gcc/testsuite/g++.dg/parse/parse2.C b/gcc/testsuite/g++.dg/parse/parse2.C new file mode 100644 index 000000000..80a9e38f4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse2.C @@ -0,0 +1,8 @@ +/* PR c++/67 */ +/* { dg-do compile } */ + +template <class T> struct foo { + static const int bar [3]; +}; +// Used to fail if 2+1 rather than 3. +template <class T> const int foo<T>::bar [2+1] = { 0, 0, 0 }; diff --git a/gcc/testsuite/g++.dg/parse/parse3.C b/gcc/testsuite/g++.dg/parse/parse3.C new file mode 100644 index 000000000..5f24cd159 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse3.C @@ -0,0 +1,7 @@ +/* PR c++/80 */ +/* { dg-do compile } */ + +/* Used to get: + bug.C:7: semicolon missing after declaration of `numbers' +*/ +enum numbers { zero, one, two, three } __attribute__ ((packed)) ; diff --git a/gcc/testsuite/g++.dg/parse/parse4.C b/gcc/testsuite/g++.dg/parse/parse4.C new file mode 100644 index 000000000..9df1754ab --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse4.C @@ -0,0 +1,25 @@ +/* PR c++/88 */ +/* { dg-do compile } */ + +class Hvec +{ +public: + Hvec(double x, double y, double z); + ~Hvec(); +}; + + +class Camera1 +{ +public: + Camera1(const Hvec &basepos=Hvec(0.0,0.0,0.0)); + ~Camera1(); +}; + +class Camera2 +{ +public: + Camera2(const Hvec &basepos); + inline Camera2() { Camera2(Hvec(0.0,0.0,0.0)); } + ~Camera2(); +}; diff --git a/gcc/testsuite/g++.dg/parse/parse5.C b/gcc/testsuite/g++.dg/parse/parse5.C new file mode 100644 index 000000000..f9e6a0359 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse5.C @@ -0,0 +1,33 @@ +/* PR c++/590 */ +/* { dg-do compile } */ + +#include <iostream> +#include <sstream> +using namespace std; + +enum ExternalEnum { EXTERNAL_VALUE = 2 }; + +class BadStream : public ostringstream +{ +public: + enum InternalEnum { VALUE = 0 }; + BadStream( InternalEnum e ) {} + BadStream( InternalEnum e, int i ) {} +}; + +int main() +{ + ( BadStream( BadStream::VALUE ) ) << "foobar" << endl; + + BadStream((BadStream::InternalEnum)BadStream::VALUE ) << "foobar"; + + BadStream::InternalEnum in = BadStream::VALUE; + BadStream( in ) << "foobar"; + + BadStream( BadStream::VALUE, 0 ) << "foobar" << endl; + + // This didn't used to compile: + BadStream( BadStream::VALUE ) << "foobar" << endl; + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/parse6.C b/gcc/testsuite/g++.dg/parse/parse6.C new file mode 100644 index 000000000..73f7256d3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse6.C @@ -0,0 +1,31 @@ +/* PR c++/3012 */ +/* { dg-do compile } */ + +class A +{ + public: + + template <class T> + void foo() const + { + } +}; + +template <class T> +class B +{ + public: + + void bar(const A& a) const + { + // Compile used to fail with parse error before `;' token + a.foo<double>(); + } +}; + +int main() +{ + A a; + B<int> b; + b.bar(a); +} diff --git a/gcc/testsuite/g++.dg/parse/parse7.C b/gcc/testsuite/g++.dg/parse/parse7.C new file mode 100644 index 000000000..3676ded4c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parse7.C @@ -0,0 +1,24 @@ +/* PR c++/3650 */ +/* { dg-do compile } */ + +class class1 { +public: + explicit class1(double a) { data = a; } + double data; +}; + +class class2 { +public: + class2(class1 a, float t) { } + class2(float t, class1 a) { } +}; + +int main() { + float t2 = 1.5; + double pir = 3.14159; + // Used to get: error: type specifier omitted for parameter `t2' + class2 h(class1(double(pir)), t2); + class2 i(class1(pir), t2); + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C b/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C new file mode 100644 index 000000000..3510aac90 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parser-pr14875-2.C @@ -0,0 +1,31 @@ +// PR 14875: When using 'or' keyword, the error message speaks of a '||' token +// { dg-do compile } +// { dg-options "" } +#define CHECK(x) void ::x + CHECK (and); // { dg-error "before .and. token" } + CHECK (and_eq); // { dg-error "before .and_eq. token" } + CHECK (bitand); // { dg-error "before .bitand. token" } + CHECK (bitor); // { dg-error "before .bitor. token" } + CHECK (compl); // { dg-error "before .compl. token" } + CHECK (not); // { dg-error "before .not. token" } + CHECK (not_eq); // { dg-error "before .not_eq. token" } + CHECK (or); // { dg-error "before .or. token" } + CHECK (or_eq); // { dg-error "before .or_eq. token" } + CHECK (xor); // { dg-error "before .xor. token" } + CHECK (xor_eq); // { dg-error "before .xor_eq. token" } +#undef CHECK +#define CHECK(x) int x + CHECK (<:); // { dg-error "before .<:. token" } + CHECK (:>); // { dg-error "before .:>. token" } +#undef CHECK +#define CHECK(x) x + CHECK (<%); // { dg-error "before .<%. token" } +#undef CHECK +#define CHECK(x) x x + CHECK (%>); // { dg-error "before .%>. token" } +#undef CHECK +#define CHECK(x) x + CHECK (%:); // { dg-error "stray .%:. " } + CHECK (%:%:); // { dg-error "stray .%:%:. " } + + diff --git a/gcc/testsuite/g++.dg/parse/parser-pr14875.C b/gcc/testsuite/g++.dg/parse/parser-pr14875.C new file mode 100644 index 000000000..7a6f06186 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parser-pr14875.C @@ -0,0 +1,20 @@ +// PR 14875: When using 'or' keyword, the error message speaks of a '||' token +// { dg-do compile } +// { dg-options "" } +using namespace std; + +class Sample +{ + +public: + Sample(); + void or(long Digital); // { dg-error "before .or. token" } +}; + +Sample::Sample() +{ +} + +void Sample::or(long Digital) // { dg-error "before .or. token" } +{ +} diff --git a/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C b/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C new file mode 100644 index 000000000..bcccb94a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parser-pr28152-2.C @@ -0,0 +1,13 @@ +/* PR 28152: error messages should mention __complex__ */ +/* { dg-do compile } */ +/* { dg-options "" } */ +int +main (void) +{ + __complex__ float z; + + z = __complex__ (1.90000007326203904e+19, 0.0); // { dg-error "expected primary-expression before '__complex__'" } + // { dg-error "expected .;. before .__complex__." "" { target *-*-* } 9 } + z = __complex__ (1.0e+0, 0.0) / z; // { dg-error "expected primary-expression before '__complex__'" } + // { dg-error "expected .;. before '__complex__'" "" { target *-*-* } 11 } + // { dg-error "at end of input" "" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/parse/parser-pr28152.C b/gcc/testsuite/g++.dg/parse/parser-pr28152.C new file mode 100644 index 000000000..5b3a25e18 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/parser-pr28152.C @@ -0,0 +1,13 @@ +/* PR 28152: error messages should mention _Complex */ +/* { dg-do compile } */ +/* { dg-options "" } */ +int +main (void) +{ + _Complex float z; + + z = _Complex (1.90000007326203904e+19, 0.0); // { dg-error "expected primary-expression before '_Complex'" } + // { dg-error "expected .;. before ._Complex." "" { target *-*-* } 9 } + z = _Complex (1.0e+0, 0.0) / z; // { dg-error "expected primary-expression before '_Complex'" } + // { dg-error "expected .;. before '_Complex'" "" { target *-*-* } 11 } + // { dg-error "at end of input" "" { target *-*-* } 11 } diff --git a/gcc/testsuite/g++.dg/parse/pr16696-permissive.C b/gcc/testsuite/g++.dg/parse/pr16696-permissive.C new file mode 100644 index 000000000..1d8a920ad --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr16696-permissive.C @@ -0,0 +1,17 @@ +// PR 16696 Strange message when operator++ not found +// { dg-do compile } +// { dg-options "-fdiagnostics-show-option -fpermissive" } + + +struct X { void operator++(); }; +struct Y { }; + +int main () { + X x; + Y y; + x++; // { dg-warning "trying prefix operator" } + + y++; // { dg-warning "trying prefix operator" } + // { dg-error "no match" "" { target *-*-* } 14 } +} + diff --git a/gcc/testsuite/g++.dg/parse/pr16696.C b/gcc/testsuite/g++.dg/parse/pr16696.C new file mode 100644 index 000000000..902e2a1a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr16696.C @@ -0,0 +1,17 @@ +// PR 16696 Strange message when operator++ not found +// { dg-do compile } +// { dg-options "-fdiagnostics-show-option" } + + +struct X { void operator++(); }; +struct Y { }; + +int main () { + X x; + Y y; + x++; // { dg-bogus "trying prefix operator" } + // { dg-error "fpermissive" "" { target *-*-* } 12 } + y++; // { dg-bogus "trying prefix operator" } + // { dg-error "fpermissive" "" { target *-*-* } 14 } +} + diff --git a/gcc/testsuite/g++.dg/parse/pr20118.C b/gcc/testsuite/g++.dg/parse/pr20118.C new file mode 100644 index 000000000..94e000a6f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr20118.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "-fshow-column" } +template<typename t>struct foo { + static const int i; }; + +const int foo<bool>::i = 5; // { dg-error "11:specializing member .foo<bool>::i. requires .template<>. syntax" } + +int main() { return 0; } + diff --git a/gcc/testsuite/g++.dg/parse/pr26997.C b/gcc/testsuite/g++.dg/parse/pr26997.C new file mode 100644 index 000000000..acd1e07be --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr26997.C @@ -0,0 +1,50 @@ +// PR c++/26997 +// { dg-do compile } +void * malloc (unsigned long size); +typedef struct { int a; } t; + +void foo() +{ + t *v3; + v3 = (t *) + malloc( + sizeof(t) + * + t->a // { dg-error "before '->' token" } + ); +} + +class C { +public: + void operator[](int); +}; + +C bar (void) +{ + (C ())(3); // { dg-error "invalid cast" } + return (C ()); +} + +extern void baz (C,C); + +void foo1 (void) +{ + baz ((C()), (C())); +} + +struct S { + void operator()(int); +}; + +int *var; +void foo2 (void) +{ + C ()[2]; + (C ())[2]; + (S ())(3); // { dg-error "invalid cast" } + (C())*var; // { dg-error "invalid cast" } + (C())+var; // { dg-error "invalid cast" } + S()(3); + (S()(3)); +} + diff --git a/gcc/testsuite/g++.dg/parse/pr37862.C b/gcc/testsuite/g++.dg/parse/pr37862.C new file mode 100644 index 000000000..89b4b6994 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr37862.C @@ -0,0 +1,25 @@ +// { dg-do run } +#include <stdlib.h> + +class A { +public: + virtual void get (void) { } +}; + +class B : public A { +public: + void get (void) { abort (); } +}; + +class C : public B { }; + +int main (void) +{ + C c; + C * p = &c; + + p->A::get (); + (p->A::get) (); // The C++ parser used to resolve this to B::get() + + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/pr56239.C b/gcc/testsuite/g++.dg/parse/pr56239.C new file mode 100644 index 000000000..08f7f6889 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr56239.C @@ -0,0 +1,13 @@ +// PR c++/56239 +// { dg-do compile } + +struct S +{ + int operator () () { return 0; } +}; + +int +main () +{ + return (S ()) (); +} diff --git a/gcc/testsuite/g++.dg/parse/pragma1.C b/gcc/testsuite/g++.dg/parse/pragma1.C new file mode 100644 index 000000000..88a56aafb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pragma1.C @@ -0,0 +1,8 @@ +// PR c++/17916 + +class T { +#pragma X + struct S { + }; +#pragma Y +}; diff --git a/gcc/testsuite/g++.dg/parse/pragma2.C b/gcc/testsuite/g++.dg/parse/pragma2.C new file mode 100644 index 000000000..c5616ff74 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pragma2.C @@ -0,0 +1,8 @@ +// PR c++/17595 + +// Ideally, the #pragma error would come one line further down, but it +// does not. +int f(int x, +#pragma interface // { dg-error "not allowed here" } + // The parser gets confused and issues an error on the next line. + int y); // { dg-bogus "" "" { xfail *-*-* } } diff --git a/gcc/testsuite/g++.dg/parse/pragma3.C b/gcc/testsuite/g++.dg/parse/pragma3.C new file mode 100644 index 000000000..36d7a8c62 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pragma3.C @@ -0,0 +1,26 @@ +// PR c++/25294 +// { dg-do run } + +extern "C" void abort (void); + +struct S +{ + char a[3]; +#pragma pack(1) /* A block comment + that ends on the next line. */ + struct T + { + char b; + int c; + } d; +#pragma pack /*/ */ () // C++ comment + int e; +} s; + +int +main () +{ + if (sizeof (int) == 4 && sizeof (s) != 12) + abort (); + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/primary-expression-1.C b/gcc/testsuite/g++.dg/parse/primary-expression-1.C new file mode 100644 index 000000000..931ecd88a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/primary-expression-1.C @@ -0,0 +1,58 @@ +// Copyright (C) 2002 Free Software Foundation +// Origin: C++/717 +// Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net +// { dg-do compile } + +class _eAny +{ +public: + _eAny(){} +}; + +template <class X> +class _eSeq +{ +public: + _eSeq(const X thing){} + int _oHash() {return 0;} + _eSeq<X > _oPlusPlus(const _eSeq<X > other) const + { + return *this; + } + _eSeq<X > take(const _eSeq<X > other) const + { + return *this; + } +}; + + +template <class X> +class _eHndl +{ +public: + _eHndl(const _eAny *obj){} +}; + +class VarInstances : public _eAny +{ +public: + VarInstances() : _eAny() {} +}; + +void testFunc(const VarInstances *testInstance) +{ + const _eSeq<_eHndl<VarInstances> > temp1 = + _eSeq<_eHndl<VarInstances> >(_eHndl<VarInstances>(testInstance)); + + if((_eSeq<_eHndl<VarInstances> + >(_eHndl<VarInstances>(testInstance))._oPlusPlus(temp1)._oHash() == + 7)) + { + return; + } +} + +int main(int argc, char** argv) +{ + testFunc(new VarInstances()); +} diff --git a/gcc/testsuite/g++.dg/parse/ptrmem1.C b/gcc/testsuite/g++.dg/parse/ptrmem1.C new file mode 100644 index 000000000..b1174c7d9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem1.C @@ -0,0 +1,10 @@ +struct A { + void f(int = 0) const; +}; + +typedef void (A::*PF)(int) const; + +void f() +{ + PF pf = &A::f; +} diff --git a/gcc/testsuite/g++.dg/parse/ptrmem2.C b/gcc/testsuite/g++.dg/parse/ptrmem2.C new file mode 100644 index 000000000..bbc116e99 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem2.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 2 Dec 2004 <nathan@codesourcery.com> + +// PR 18782: ICE with ptr-to-member +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +namespace A {} + +int A::* p; // { dg-error "is a namespace" "" } diff --git a/gcc/testsuite/g++.dg/parse/ptrmem3.C b/gcc/testsuite/g++.dg/parse/ptrmem3.C new file mode 100644 index 000000000..444f25cd2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem3.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 14 Feb 2005 <nathan@codesourcery.com> + +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> +// Bug 19895: ICE on invalid + + +template<typename> struct A +{ + int A<0>::* p; // { dg-error "(type/value mismatch)|(expected)" "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/ptrmem4.C b/gcc/testsuite/g++.dg/parse/ptrmem4.C new file mode 100644 index 000000000..fea08f206 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem4.C @@ -0,0 +1,4 @@ +// PR c++/26295 + +namespace A {} +int (A::*B)(); // { dg-error "namespace" } diff --git a/gcc/testsuite/g++.dg/parse/ptrmem5.C b/gcc/testsuite/g++.dg/parse/ptrmem5.C new file mode 100644 index 000000000..1101ad9fd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem5.C @@ -0,0 +1,9 @@ +// PR c++/27806 + +struct A {}; + +void foo() +{ + p; // { dg-error "p" } + extern int A::* p; +} diff --git a/gcc/testsuite/g++.dg/parse/ptrmem6.C b/gcc/testsuite/g++.dg/parse/ptrmem6.C new file mode 100644 index 000000000..6dac21cf9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ptrmem6.C @@ -0,0 +1,11 @@ +//PR C++/27805 + +struct A; + +void foo() +{ + int A::* p; + A a; // { dg-error "incomplete type" } + a.*p; +} + diff --git a/gcc/testsuite/g++.dg/parse/pure1.C b/gcc/testsuite/g++.dg/parse/pure1.C new file mode 100644 index 000000000..2b6f28b7d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pure1.C @@ -0,0 +1,11 @@ +// PR c++/28506 + +struct A +{ + virtual void* foo() = 1; // { dg-error "pure" } +}; + +struct B +{ + void operator()()() = 1; // { dg-error "pure|function|initializer" } +}; diff --git a/gcc/testsuite/g++.dg/parse/qualified1.C b/gcc/testsuite/g++.dg/parse/qualified1.C new file mode 100644 index 000000000..6dfb87e17 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/qualified1.C @@ -0,0 +1,14 @@ +struct A {}; + +struct B : public A +{ + static void foo (); +}; + +template <typename T> struct C +{ + C() : f(B::foo) {} + void (*f)(); +}; + +C<int> c; diff --git a/gcc/testsuite/g++.dg/parse/qualified2.C b/gcc/testsuite/g++.dg/parse/qualified2.C new file mode 100644 index 000000000..c582613c9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/qualified2.C @@ -0,0 +1,4 @@ +namespace Glib { + template <typename> class Value {}; + template <> class Glib::Value<int> {}; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/qualified3.C b/gcc/testsuite/g++.dg/parse/qualified3.C new file mode 100644 index 000000000..ab160ab8d --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/qualified3.C @@ -0,0 +1,8 @@ +// PR c++/18466 + +int ::i; // { dg-error "" } +void ::f(); // { dg-error "" } +namespace N { + int N::j; // { dg-error "" } + void N::g(); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/qualified4.C b/gcc/testsuite/g++.dg/parse/qualified4.C new file mode 100644 index 000000000..c827fcfe7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/qualified4.C @@ -0,0 +1,6 @@ +// PR c++/16782 +// { dg-options "" } + +struct X { + void X::bar() {} // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/redef1.C b/gcc/testsuite/g++.dg/parse/redef1.C new file mode 100644 index 000000000..0235ffb72 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/redef1.C @@ -0,0 +1,10 @@ +// { dg-options "" } +// PR c++/16193 + +# 1 "syshdr1.C" +# 1 "syshdr1.h" 1 3 +// Redefinitions of built-in types are allowed in system headers so +// that G++ will work with system headers that are not fully +// C++-aware. +typedef long wchar_t; +# 2 "syshdr1.C" 2 diff --git a/gcc/testsuite/g++.dg/parse/redef2.C b/gcc/testsuite/g++.dg/parse/redef2.C new file mode 100644 index 000000000..2435672d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/redef2.C @@ -0,0 +1,7 @@ +// { dg-do compile } + +char * d [10]; // { dg-error "8: 'd' has a previous declaration as" } +char e [15][10]; +int (*f)(); + +int d; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/ref1.C b/gcc/testsuite/g++.dg/parse/ref1.C new file mode 100644 index 000000000..d1dffb067 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ref1.C @@ -0,0 +1,17 @@ +// PR c++/6402 +// Origin: Wolfgang Bangerth <wolfgang@dealii.org> +// { dg-do compile } + +class A +{ + A (const A&); + public: + A(); +}; + +struct B { A a; }; + +struct C : public B +{ + void foo() { const A &ref = B::a; } // taking reference, not a copy! +}; diff --git a/gcc/testsuite/g++.dg/parse/register1.C b/gcc/testsuite/g++.dg/parse/register1.C new file mode 100644 index 000000000..3be2e6525 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/register1.C @@ -0,0 +1,14 @@ +// PR c++/23839 + +class C +{ + int i; +public: + C(int j) : i(j) { } + operator int() { return i; } +}; + +C f (register C x) +{ + return x + 31; +} diff --git a/gcc/testsuite/g++.dg/parse/repo1.C b/gcc/testsuite/g++.dg/parse/repo1.C new file mode 100644 index 000000000..efadd5872 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/repo1.C @@ -0,0 +1,10 @@ +// { dg-options "-frepo" } +// { dg-require-host-local "" } + +extern "C" inline void f() {} + +int main () { + f(); +} + +// { dg-final { cleanup-repo-files } } diff --git a/gcc/testsuite/g++.dg/parse/ret-type1.C b/gcc/testsuite/g++.dg/parse/ret-type1.C new file mode 100644 index 000000000..a5dc93ab0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ret-type1.C @@ -0,0 +1,10 @@ +// PR c++/2738 +// Origin: Wolfgang Bangerth <wolfgang.bangerth@iwr.uni-heidelberg.de> +// { dg-do compile } + +template <int i> class A +{ + class C { C(); }; +}; + +template <int i> void A<i>::C::C () {} // { dg-error "return type" } diff --git a/gcc/testsuite/g++.dg/parse/ret-type2.C b/gcc/testsuite/g++.dg/parse/ret-type2.C new file mode 100644 index 000000000..35638c28a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ret-type2.C @@ -0,0 +1,10 @@ +struct S {} f(); // { dg-error "return" "err" } +// { dg-message "note" "note" { target *-*-* } 1 } +struct T {} *g(); // { dg-error "return" } +// { dg-message "note" "note" { target *-*-* } 3 } +struct U {} h() {} // { dg-error "return" } +// { dg-message "note" "note" { target *-*-* } 5 } +struct V {} *i() {} // { dg-error "return" } +// { dg-message "note" "note" { target *-*-* } 7 } +struct W {} (*p) (); // { dg-error "return" } +// { dg-message "note" "note" { target *-*-* } 9 } diff --git a/gcc/testsuite/g++.dg/parse/ret-type3.C b/gcc/testsuite/g++.dg/parse/ret-type3.C new file mode 100644 index 000000000..33ee31748 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ret-type3.C @@ -0,0 +1,8 @@ +// PR c++/21369 + +struct bar; + +template <class T> struct bar *foo (T *p) +{ + return p->t; +} diff --git a/gcc/testsuite/g++.dg/parse/saved1.C b/gcc/testsuite/g++.dg/parse/saved1.C new file mode 100644 index 000000000..f7281088f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/saved1.C @@ -0,0 +1,6 @@ +// Test that the parser doesn't go into an infinite loop from ignoring the +// PRE_PARSED_FUNCTION_DECL token. + +class C { static void* operator new(size_t); }; // { dg-error "" "" } +void* C::operator new(size_t) { return 0; } // { dg-error "" "" } +class D { D(int i): integer(i){}}; // { dg-error "" "" } diff --git a/gcc/testsuite/g++.dg/parse/semicolon1.C b/gcc/testsuite/g++.dg/parse/semicolon1.C new file mode 100644 index 000000000..22c1e86e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/semicolon1.C @@ -0,0 +1,4 @@ +// PR c++/12479 +// { dg-options "-pedantic" } + +#include "semicolon1.h" diff --git a/gcc/testsuite/g++.dg/parse/semicolon1.h b/gcc/testsuite/g++.dg/parse/semicolon1.h new file mode 100644 index 000000000..0487fc783 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/semicolon1.h @@ -0,0 +1,2 @@ +#pragma GCC system_header +; diff --git a/gcc/testsuite/g++.dg/parse/semicolon2.C b/gcc/testsuite/g++.dg/parse/semicolon2.C new file mode 100644 index 000000000..d14a225a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/semicolon2.C @@ -0,0 +1,9 @@ +// PR c++/45332 +// { dg-do compile } + +class C +{ + int x // { dg-error "at end of member declaration" } + + const int foo() { return x; } +}; diff --git a/gcc/testsuite/g++.dg/parse/semicolon3.C b/gcc/testsuite/g++.dg/parse/semicolon3.C new file mode 100644 index 000000000..8a2b1ac46 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/semicolon3.C @@ -0,0 +1,260 @@ +// PR c++/45331 +// { dg-do compile } +// { dg-options -std=c++98 } + +struct OK1 +{ + int a; +} // no complaints + *s5; + +struct OK2 +{ + int a; +} // no complaints + &s6 = *(new OK2()); + +struct OK3 +{ + int a; +} // no complaints + (s7); + +__SIZE_TYPE__ +test_offsetof (void) +{ + // no complaints about a missing semicolon + return __builtin_offsetof (struct OK4 { int a; int b; }, b); +} + +struct OK5 +{ + int a; +} ok5_var; // no complaints + +struct OK6 +{ + int a; +} static ok6_var; // no complaints + +class OK7 +{ +public: + OK7() { }; + int a; +} const ok7_var; // no complaints + +class OK8 +{ + int a; +} extern ok8_var; // no complaints + +class OK9 +{ + class OK9sub { int a; } mutable ok9sub; // no complaints + int a; +}; + +int +autotest (void) +{ + struct OK10 { int a; } auto ok10 = { 0 }; // no complaints + + return ok10.a; +} + +struct OK11 +{ + int a; +} // no complaints + const *ok11_var; + +struct OK12 +{ + int a; +} // no complaints + const &ok12_var = *(new OK12()); + +struct OK13 +{ + int a; +} // no complaints + static *ok13_var; + +class OK14 +{ + struct OK14sub + { + int a; + } // no complaints + static &ok14_var; +}; + +class OK15 +{ + int a; +} typedef tOK15; + +class OK16 +{ + int a; +} typedef *pOK16; + +class OK17 +{ + int a; +} typedef &rOK16; + +struct E1 +{ + int a; +} // { dg-error "after struct definition" } + +typedef float BAR; + +struct E2 +{ + int a; +} // { dg-error "after struct definition" } + +const int i0 = 1; + +struct E3 +{ + int a; +} // { dg-error "after struct definition" } + +volatile long l0 = 1; + +struct E4 +{ + int a; +} // { dg-error "after struct definition" } + +extern char c0; + +struct E5 +{ + int a; +} // { dg-error "after struct definition" } + +static wchar_t wc0; + +struct E6 +{ + int a; +} // { dg-error "after struct definition" } + +bool b0; + +class E7 +{ + int a; +} // { dg-error "after class definition" } + +extern double d0; + +class E8 +{ + int a; +} // { dg-error "after class definition" } + +inline short f(void) +{ + return 2; +} + +class E9 +{ + int a; +} // { dg-error "after class definition" } + +class D0 +{ + int a; +}; + +class E10 +{ + int a; +} // { dg-error "after class definition" } + +extern class D0 &f0 (void); + +class E11 +{ + int a; +} // { dg-error "after class definition" } + +const struct E6 *f1 (void) { return 0; } + +union U0 { + int i; + double d; +}; + +class E12 +{ + int a; +} // { dg-error "after class definition" } + +const union U0 *f2 (void) { return 0; } + +enum e { + U, V +}; + +class E13 +{ + int a; +} // { dg-error "after class definition" } + +static enum e f3 (void) { return U; } + +union E14 +{ + int i; + double d; +} // { dg-error "after union definition" } + +unsigned int i1 = 2; + +union E15 +{ + int i; + double d; +} // { dg-error "after union definition" } + +signed long l1 = 3; + +class E16 +{ + class sub0 { int a; } // { dg-error "after class definition" } + virtual int f2 (void); +} // { dg-error "after class definition" } + +class E17 +{ + class sub0 { int a; } // { dg-error "after class definition" } + mutable int i; +} // { dg-error "after class definition" } + +class E18 +{ + int a; +} // { dg-error "after class definition" } + +typedef int E18int; + +/* This was the original test from the PR. */ + +class C0 +{ +public: + int a; +} // { dg-error "after class definition" } + +const int foo(const C0 &x) +{ + return x.a; +} diff --git a/gcc/testsuite/g++.dg/parse/semicolon4.C b/gcc/testsuite/g++.dg/parse/semicolon4.C new file mode 100644 index 000000000..adba7a873 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/semicolon4.C @@ -0,0 +1,37 @@ +// PR c++/46890 +// { dg-do compile } + +struct OK1 +{ + int i; +} const *ok1_var; // No complains + +struct OK2; +extern OK2 ok2a_var; + +struct OK2 +{ + int i; +} const &ok2_var = ok2a_var; // No complains + +struct OK3 +{ + int i; +} volatile (ok3_var); // No complains + +struct E1 +{ + int i; +} const; // { dg-error "qualifiers can only be specified for objects and functions" } + +void foo ( +struct E2 +{ // { dg-error "types may not be defined in parameter types" } + int i; +} volatile); + +void bar ( +struct E3 +{ // { dg-error "types may not be defined in parameter types" } + int i; +} const, int); diff --git a/gcc/testsuite/g++.dg/parse/specialization1.C b/gcc/testsuite/g++.dg/parse/specialization1.C new file mode 100644 index 000000000..8a47f1772 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/specialization1.C @@ -0,0 +1,7 @@ +// PR c++/5723, PR c++/8522 +// Origin: Matthias Kleinmann, Peter Karl Mueller <peter.karl.mueller@gmx.de> +// { dg-do compile } + +template <typename T> class A; +template <typename T> class A<T>::B; // { dg-error "declaration" "err" } +// { dg-warning "declaration" "warn" { target *-*-* } 6 } diff --git a/gcc/testsuite/g++.dg/parse/stack1.C b/gcc/testsuite/g++.dg/parse/stack1.C new file mode 100644 index 000000000..ac26e6006 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/stack1.C @@ -0,0 +1,14 @@ +/* PR c/2161: parser stack overflow. */ +/* { dg-do compile } */ + +#define ONE else if (0) { } +#define TEN ONE ONE ONE ONE ONE ONE ONE ONE ONE ONE +#define HUN TEN TEN TEN TEN TEN TEN TEN TEN TEN TEN +#define THOU HUN HUN HUN HUN HUN HUN HUN HUN HUN HUN + +void foo() +{ + if (0) { } + /* 11,000 else if's. */ + THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU THOU +} diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr1.C b/gcc/testsuite/g++.dg/parse/stmtexpr1.C new file mode 100644 index 000000000..4455398bc --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/stmtexpr1.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// { dg-options "" } + +int +main (int argc, char **argv) +{ + int a = ({ 1 ? 0 : 1; }); + return ({ argc > 1 ? 1 : 0; }); +} diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr2.C b/gcc/testsuite/g++.dg/parse/stmtexpr2.C new file mode 100644 index 000000000..44f7f85bc --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/stmtexpr2.C @@ -0,0 +1,11 @@ +// { dg-do compile } +// { dg-options "" } + +#define DMAX(a,b) ({double _a = (a), _b = (b); _a > _b ? _a : _b; }) + +void foo(void) +{ + double xl, dy; + xl = DMAX(dy, 0.0); +} + diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr3.C b/gcc/testsuite/g++.dg/parse/stmtexpr3.C new file mode 100644 index 000000000..79f689316 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/stmtexpr3.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// { dg-options "" } + +struct B +{ + int a; + B() : a(({ 1; })) {} +}; diff --git a/gcc/testsuite/g++.dg/parse/struct-1.C b/gcc/testsuite/g++.dg/parse/struct-1.C new file mode 100644 index 000000000..6e0d93aad --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-1.C @@ -0,0 +1,4 @@ +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// PR c++/18731 + +template<typename T> struct T::A {}; // { dg-error "invalid class name" } diff --git a/gcc/testsuite/g++.dg/parse/struct-2.C b/gcc/testsuite/g++.dg/parse/struct-2.C new file mode 100644 index 000000000..b63045bf9 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-2.C @@ -0,0 +1,7 @@ +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// PR c++/18731 + +template<typename T> struct A +{ + struct T::B {}; // { dg-error "invalid class name" } +}; diff --git a/gcc/testsuite/g++.dg/parse/struct-3.C b/gcc/testsuite/g++.dg/parse/struct-3.C new file mode 100644 index 000000000..8e73ce4f0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-3.C @@ -0,0 +1,10 @@ +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// PR c++/18731 + +struct A +{ + struct B; + typedef B C; +}; + +struct A::C {}; // { dg-error "invalid class name" } diff --git a/gcc/testsuite/g++.dg/parse/struct-4.C b/gcc/testsuite/g++.dg/parse/struct-4.C new file mode 100644 index 000000000..6d01f3e88 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-4.C @@ -0,0 +1,13 @@ +/* PR c/35437 */ +/* { dg-do compile } */ + +struct A +{ + int i; + struct A a; /* { dg-error "has incomplete type" } */ +}; + +void foo() +{ + struct A b = { 0 }; +} diff --git a/gcc/testsuite/g++.dg/parse/struct-as-enum1.C b/gcc/testsuite/g++.dg/parse/struct-as-enum1.C new file mode 100644 index 000000000..f58c73881 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/struct-as-enum1.C @@ -0,0 +1,10 @@ +// PR c++/163, PR c++/8595 +// Origin: <martin@loewis.home.cs.tu-berlin.de>, Mark Leone <mleone@pixar.com> +// { dg-do compile } + +namespace N +{ + struct A {}; // { dg-error "previous declaration" } +} + +typedef enum N::A B; // { dg-error "enum|invalid type" } diff --git a/gcc/testsuite/g++.dg/parse/template1.C b/gcc/testsuite/g++.dg/parse/template1.C new file mode 100644 index 000000000..d7bbb073f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template1.C @@ -0,0 +1,11 @@ +struct CPU { + typedef int (*pfun)(); + + template <pfun step1> + static int dispatch(); +}; + +template<int> +static int foo(); + +template int CPU::dispatch<&template foo<2> > (); // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/template10.C b/gcc/testsuite/g++.dg/parse/template10.C new file mode 100644 index 000000000..d5dec6ed1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template10.C @@ -0,0 +1,15 @@ +// PR c++/9486 +// Origin: John Levon <levon@movementarian.org> +// { dg-do compile } + +template <typename> struct A +{ + template <typename T> void foo(T); +}; + +template <typename T> void bar() +{ + A<void>().template foo<T>(0); +} + +template void bar<int>(); diff --git a/gcc/testsuite/g++.dg/parse/template11.C b/gcc/testsuite/g++.dg/parse/template11.C new file mode 100644 index 000000000..e651a3bd0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template11.C @@ -0,0 +1,15 @@ +// PR c++/9488 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +struct A +{ + template <typename> void foo() {} +}; + +template <typename T> struct B +{ + void bar() { A().foo<T>(); } +}; + +template struct B<int>; diff --git a/gcc/testsuite/g++.dg/parse/template12.C b/gcc/testsuite/g++.dg/parse/template12.C new file mode 100644 index 000000000..ba375bc43 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template12.C @@ -0,0 +1,10 @@ +template <int J> +struct A { +}; + +struct B { + template <int I> + struct C : public A<I> {}; + + typedef double I; +}; diff --git a/gcc/testsuite/g++.dg/parse/template13.C b/gcc/testsuite/g++.dg/parse/template13.C new file mode 100644 index 000000000..b1c03690b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template13.C @@ -0,0 +1,10 @@ +// PR c++/14002 + +template <typename T> void foo (T x) { x; } + +void bar() { foo(0); } + +struct A +{ + friend void foo<int> (int); +}; diff --git a/gcc/testsuite/g++.dg/parse/template14.C b/gcc/testsuite/g++.dg/parse/template14.C new file mode 100644 index 000000000..ada875243 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template14.C @@ -0,0 +1,17 @@ +// PR c++/14550 + +struct A { + A(); +}; + +template <int> void foo() +{ + A *p = new A; +} + +void bar() +{ + foo<0>(); +} + + diff --git a/gcc/testsuite/g++.dg/parse/template15.C b/gcc/testsuite/g++.dg/parse/template15.C new file mode 100644 index 000000000..ce2d13036 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template15.C @@ -0,0 +1,26 @@ +// { dg-do compile } +// Contributed by: Peter Schmid +// <schmid at snake dot iap dot physik dot tu-darmstadt dot de> +// PR c++/14545: constructor calls are not integer constant expressions + +struct A1 { A1(); }; +struct A2 { }; + +template <class T> +struct B +{ + void foo() { + A1(); + A1 a1 = A1(); + + A2(); + A2 a2 = A2(); + + int(); + int a3 = int(); + float(); + float a4 = float(); + } +}; + +template struct B<void>; diff --git a/gcc/testsuite/g++.dg/parse/template16.C b/gcc/testsuite/g++.dg/parse/template16.C new file mode 100644 index 000000000..bc41b0f45 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template16.C @@ -0,0 +1,15 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 26 May 2005 <nathan@codesourcery.com> + +// Origin:Volker Reichelt reichelt@gcc.gnu.org +// PR 21681. ICE with inappropriate access check. + +template<int X> struct A; + +struct B +{ + template<int N> void foo() + { + A<N>::X::Y; + } +}; diff --git a/gcc/testsuite/g++.dg/parse/template17.C b/gcc/testsuite/g++.dg/parse/template17.C new file mode 100644 index 000000000..ade598d39 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template17.C @@ -0,0 +1,13 @@ +// PR c++/23841 + +template <int I> +struct S +{ + int f(int i = I) { return i; } +}; + +void +g () +{ + S<(int)0.> a2; +} diff --git a/gcc/testsuite/g++.dg/parse/template18.C b/gcc/testsuite/g++.dg/parse/template18.C new file mode 100644 index 000000000..98209b244 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template18.C @@ -0,0 +1,52 @@ +// PR c++/22173 + +struct A +{ + static void a1(); + template <typename T> + static void b1(T); + template <int I> + struct B { + static void b1(); + template <typename T> + static void b2(T); + }; + struct C { + static void c1(); + }; +}; + +template<int I> void f1() +{ + A* p; + A::template a1(); // { dg-error "template" } + A::template b1(0); + p->template a1(); // { dg-error "template" } + p->template b1('a'); + + A::template B<0>::b1(); + A::template B<0>::template b1(); // { dg-error "template" } + A::template B<0>::template b2(0); + A::template B<0>::template b2<double>(0); + + // Because B<I> is dependent, none of these are errors, as this + // function is not instantiated. + A::template B<I>::b1(); + A::template B<I>::template b1(); + A::template B<I>::template b2(0); + A::template B<I>::template b2<double>(0); + + A::template C::c1(); // { dg-error "template" } +} + +template<int I> void f2() +{ + // These are copies of lines from f1, but this function is + // instantiated, so we should get errors here. + A::template B<I>::b1(); + A::template B<I>::template b1(); // { dg-error "template" } + A::template B<I>::template b2(0); + A::template B<I>::template b2<double>(0); +} + +template void f2<0>(); // { dg-message "instantiated" } diff --git a/gcc/testsuite/g++.dg/parse/template19.C b/gcc/testsuite/g++.dg/parse/template19.C new file mode 100644 index 000000000..dc1a67334 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template19.C @@ -0,0 +1,11 @@ +// PR c++/26558 +// Origin: Jan Gorski <slimak@yk74.internetdsl.tpnet.pl> +// { dg-do compile } + +template<int> struct A +{ + template<int> void foo() + { + foo<0>::; // { dg-error "before" } + } +}; diff --git a/gcc/testsuite/g++.dg/parse/template2.C b/gcc/testsuite/g++.dg/parse/template2.C new file mode 100644 index 000000000..6689c8bfa --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template2.C @@ -0,0 +1,7 @@ +namespace N { + template < typename T > class C : T {}; +} + +int main() { + N::C(); // { dg-error "template" } +} diff --git a/gcc/testsuite/g++.dg/parse/template20.C b/gcc/testsuite/g++.dg/parse/template20.C new file mode 100644 index 000000000..2705f4629 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template20.C @@ -0,0 +1,7 @@ +// PR c++/28858 +// { dg-do compile } + +template<int N struct A; // { dg-error "before" } + +bool i = 1 > 0; // { dg-bogus "" } +int j = i; // { dg-bogus "" } diff --git a/gcc/testsuite/g++.dg/parse/template21.C b/gcc/testsuite/g++.dg/parse/template21.C new file mode 100644 index 000000000..e1ac76916 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template21.C @@ -0,0 +1,5 @@ +// PR c++/28211 + +template <const int*> class Helper { }; +const int foo = 0; +typedef Helper<&foo> HelperType; // { dg-error "linkage|type" } diff --git a/gcc/testsuite/g++.dg/parse/template22.C b/gcc/testsuite/g++.dg/parse/template22.C new file mode 100644 index 000000000..c93375685 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template22.C @@ -0,0 +1,5 @@ +/* PR c++/29731. This used to ICE in uses_template_parms. */ + +template<int> struct A {}; + +A<({})> a; /* { dg-error "forbids braced-groups within expressions|statement-expressions|template argument 1 is invalid|invalid type" } */ diff --git a/gcc/testsuite/g++.dg/parse/template23.C b/gcc/testsuite/g++.dg/parse/template23.C new file mode 100644 index 000000000..893d78d15 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template23.C @@ -0,0 +1,10 @@ +/* PR c++/30895 This used to ICE. */ +/* { dg-do compile } */ + +template<int> struct A {}; + +template<typename T> struct B +{ + A<T(0i)> a1; /* { dg-error "imaginary constants are a GCC extension" } */ + A<T(0i)> a2; /* { dg-error "imaginary constants are a GCC extension" } */ +}; diff --git a/gcc/testsuite/g++.dg/parse/template24.C b/gcc/testsuite/g++.dg/parse/template24.C new file mode 100644 index 000000000..33d9d4cfd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template24.C @@ -0,0 +1,8 @@ +/* PR c++/29731. This used to ICE in uses_template_parms. */ + +template<int> struct A {}; + +void foo() +{ + A<({})> a; /* { dg-error "forbids braced-groups within expressions|statement-expressions|template argument 1 is invalid|invalid type" } */ +} diff --git a/gcc/testsuite/g++.dg/parse/template25.C b/gcc/testsuite/g++.dg/parse/template25.C new file mode 100644 index 000000000..8ffcd121e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template25.C @@ -0,0 +1,14 @@ +// PR c++/22318. Improve diagnostic for local template declaration. +// { dg-do compile } +void f(void) +{ + template<typename T> class A /* { dg-error "a template declaration cannot appear at block scope" } */ + { + }; +} + +void g(void) +{ + template f<int>(); /* { dg-error "expected primary-expression" } */ + /* { dg-error "expected ';'" "" { target *-*-* } 12 } */ +} diff --git a/gcc/testsuite/g++.dg/parse/template3.C b/gcc/testsuite/g++.dg/parse/template3.C new file mode 100644 index 000000000..d10d46d81 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template3.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Jan 2003 <nathan@codesourcery.com> + +// PR 9403. We failed to parse template keyword, and we accepted code +// which required one. + +template<bool> struct Outer; + +template <bool b, typename T> +struct X : Outer<b>::template Inner<T> +{}; + +template <bool b, typename T> +struct Y : Outer<b>::Inner<T> {}; // { dg-error "used as template" "temp" } +// { dg-error "expected" "exp" { target *-*-* } 16 } +// { dg-message "note" "note" { target *-*-* } 16 } + diff --git a/gcc/testsuite/g++.dg/parse/template4.C b/gcc/testsuite/g++.dg/parse/template4.C new file mode 100644 index 000000000..11f11d535 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template4.C @@ -0,0 +1,21 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 32 Jan 2003 <nathan@codesourcery.com> + +// PR 795. fields are not necessarily a dependent type. + +struct V +{ + template<typename T> T get (); +}; + +struct L +{ + V v; + + template<typename T> T at (int i) + { + return v.get<T> (); + } +}; diff --git a/gcc/testsuite/g++.dg/parse/template5.C b/gcc/testsuite/g++.dg/parse/template5.C new file mode 100644 index 000000000..adc598672 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template5.C @@ -0,0 +1,19 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 28 Jan 2003 <nathan@codesourcery.com> + +// PR 3902. More type/decl confusion. + +template <class T> +struct S +{ + S foo (T (T)); + S foo (T(const T&)); +}; + +int main () +{ + S<int> (S<int>::*pf1)(int (int)) = &S<int>::foo; + S<int> (S<int>::*pf2)(int (const int&)) = &S<int>::foo; +} diff --git a/gcc/testsuite/g++.dg/parse/template6.C b/gcc/testsuite/g++.dg/parse/template6.C new file mode 100644 index 000000000..a83c313d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template6.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Wolfgang Bangerth <bangerth@ticam.utexas.edu> 20 Feb 2003. + +// PR c++/9778. Ensure templated functions in other namespaces are +// correctly instantiated. + +namespace NS { + template <int N> void foo (); +} + +template <int N> struct X { + int m; + void g () { + NS::foo<sizeof(m)>(); + } +}; + +template class X<2>; diff --git a/gcc/testsuite/g++.dg/parse/template7.C b/gcc/testsuite/g++.dg/parse/template7.C new file mode 100644 index 000000000..0d3f3fa24 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template7.C @@ -0,0 +1,5 @@ +template <int I> +void f(); // { dg-message "note" } + +void g() { f<(3, 2)>(); } // { dg-error "" } +// { dg-message "candidate" "candidate note" { target *-*-* } 4 } diff --git a/gcc/testsuite/g++.dg/parse/template8.C b/gcc/testsuite/g++.dg/parse/template8.C new file mode 100644 index 000000000..e4af7eea3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template8.C @@ -0,0 +1,16 @@ +namespace N +{ + +template <typename> struct A +{ + template <typename T> A(A<T>); +}; + +} + +void foo(N::A<int>); + +void bar() +{ + foo(N::A); // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/template9.C b/gcc/testsuite/g++.dg/parse/template9.C new file mode 100644 index 000000000..17b7da91f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template9.C @@ -0,0 +1,6 @@ +template <typename T> +void f() { + g(); // { dg-error "must be available" "err" } + // { dg-message "note" "note" { target *-*-* } 3 } + h(3); // { dg-error "must be available" } +} diff --git a/gcc/testsuite/g++.dg/parse/tmpl-outside1.C b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C new file mode 100644 index 000000000..e63e3cd44 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/tmpl-outside1.C @@ -0,0 +1,10 @@ +// PR c++/3792 +// Origin: <david.abrahams@rcn.com> +// { dg-do compile } + +struct X +{ + template <int i> struct Y {}; +}; + +typedef X::template Y<0> y; // { dg-error "template|invalid" } diff --git a/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C new file mode 100644 index 000000000..dcf2852d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-operator1.C @@ -0,0 +1,20 @@ +// PR c++/8857 +// Origin: Martin v. Loewis <loewis@informatik.hu-berlin.de> +// { dg-do compile } + +template <typename T> struct A +{ + template <typename U> operator U() { return sizeof(U); } +}; + +template <typename T> struct B +{ + template <template <typename U> class X> operator X<double>() { return X<double>(); } +}; + +int main() +{ + A<double> a; + B<long> b; + a = b; +} diff --git a/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C new file mode 100644 index 000000000..1fec1af42 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/tmpl-tmpl-param1.C @@ -0,0 +1,14 @@ +// PR c++/7259 +// Origin: Philipp Buettgenbach <P.Buettgenbach@FH-Wolfenbuettel.DE> +// Reduced version: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template <template <int> class T> class A : public T<0> {}; + +template <typename> struct B +{ + template <int> class C {}; + typedef A<C> D; +}; + +B<void>::D d; diff --git a/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C b/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C new file mode 100644 index 000000000..4d98e7546 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/too-many-tmpl-args1.C @@ -0,0 +1,11 @@ +// PR c++/9229 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <typename T> class A // { dg-error "" } +{ + struct B; + template <typename U> friend typename A<U,void>::B foo(); // { dg-error "" } +}; + +template class A<int>; diff --git a/gcc/testsuite/g++.dg/parse/try-catch-1.C b/gcc/testsuite/g++.dg/parse/try-catch-1.C new file mode 100644 index 000000000..e4ed1ad8e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/try-catch-1.C @@ -0,0 +1,14 @@ +// Test case from: <ncm-nospam@cantrip.org> +// Reduced by <bangerth@dealii.org> +// The problem was that g++ was ICE because +// it was deferring an NULL pointer because +// it should have been taking the operand 1 +// instead of the chain in finish_fname_decls. + + +void fun() +try +{ + __FUNCTION__; +} +catch (...) {} diff --git a/gcc/testsuite/g++.dg/parse/typedef1.C b/gcc/testsuite/g++.dg/parse/typedef1.C new file mode 100644 index 000000000..c4fbb950c --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef1.C @@ -0,0 +1,3 @@ +// PR c++/6477 +typedef struct A_ *A; // { dg-error "previous declaration" } +typedef struct A B; // { dg-error "typedef|invalid type" } diff --git a/gcc/testsuite/g++.dg/parse/typedef2.C b/gcc/testsuite/g++.dg/parse/typedef2.C new file mode 100644 index 000000000..3ae347d75 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef2.C @@ -0,0 +1,3 @@ +template <typename T> struct B { typedef typename T::X X; }; +template <typename T> struct A { typedef B<T>::X::Y Z; }; // { dg-error "" } + diff --git a/gcc/testsuite/g++.dg/parse/typedef3.C b/gcc/testsuite/g++.dg/parse/typedef3.C new file mode 100644 index 000000000..6b4e531b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef3.C @@ -0,0 +1,7 @@ +// PR c++/3004 +// Origin: Travis J.I. Corcoran <tjic@permabit.com> +// { dg-do compile } + +struct A { typedef A* Ptr; }; // { dg-error "previous declaration" } + +struct A::Ptr; // { dg-error "typedef|not declare anything" } diff --git a/gcc/testsuite/g++.dg/parse/typedef4.C b/gcc/testsuite/g++.dg/parse/typedef4.C new file mode 100644 index 000000000..8599fd1d8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef4.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Origin: Matt Austern <austern@apple.com> + +// PR c++/7983: ICE typedef to typename as friend. + +template<class T> class smart_ptr2 { + T* real_ptr; + public: + typedef typename T::subT td; // { dg-error "previous declaration" } + friend class td; // { dg-error "typedef|not name a class" } +}; diff --git a/gcc/testsuite/g++.dg/parse/typedef5.C b/gcc/testsuite/g++.dg/parse/typedef5.C new file mode 100644 index 000000000..7079f3713 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef5.C @@ -0,0 +1,6 @@ +namespace A +{ + typedef int T; // { dg-error "previous declaration" } +} + +class A::T x; // { dg-error "using typedef-name|invalid type" } diff --git a/gcc/testsuite/g++.dg/parse/typedef6.C b/gcc/testsuite/g++.dg/parse/typedef6.C new file mode 100644 index 000000000..d3a39fc85 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef6.C @@ -0,0 +1,6 @@ +// PR c++/14667 + +template<class T> +class Class1; + +class Class2 {} typedef Class1<Class2> Type1; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/typedef7.C b/gcc/testsuite/g++.dg/parse/typedef7.C new file mode 100644 index 000000000..126fb7ed8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef7.C @@ -0,0 +1,2 @@ +// PR c++/18285 +typedef void int char void double X; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/typedef8.C b/gcc/testsuite/g++.dg/parse/typedef8.C new file mode 100644 index 000000000..6ff26febb --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef8.C @@ -0,0 +1,11 @@ +//PR c++ 29024 + +typedef static int a; // { dg-error "conflicting" } +typedef register int b; // { dg-error "conflicting" } +typedef extern int c; // { dg-error "conflicting" } +static typedef int a; // { dg-error "conflicting" } + +int foo() +{ + typedef auto int bar; // { dg-error "conflicting" } +} diff --git a/gcc/testsuite/g++.dg/parse/typedef9.C b/gcc/testsuite/g++.dg/parse/typedef9.C new file mode 100644 index 000000000..7788f781f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typedef9.C @@ -0,0 +1,8 @@ +// PR c++/38794 +// { dg-do compile } + +typedef void foo () {} // { dg-error "invalid function declaration" } +struct S +{ + typedef int bar (void) { return 0; } // { dg-error "invalid member function declaration" } +}; diff --git a/gcc/testsuite/g++.dg/parse/typename1.C b/gcc/testsuite/g++.dg/parse/typename1.C new file mode 100644 index 000000000..2af84e3d7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename1.C @@ -0,0 +1,5 @@ +template <class baz> +struct bar +{ + typedef typename baz::typename rebind<int> foo; // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/typename10.C b/gcc/testsuite/g++.dg/parse/typename10.C new file mode 100644 index 000000000..64d6ae8c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename10.C @@ -0,0 +1,8 @@ +// PR c++/19253 + +namespace N { struct X; } + +template<typename> struct A +{ + A<typename N::X x> a; // { dg-error "invalid" } +}; diff --git a/gcc/testsuite/g++.dg/parse/typename11.C b/gcc/testsuite/g++.dg/parse/typename11.C new file mode 100644 index 000000000..a79e6d887 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename11.C @@ -0,0 +1,16 @@ +// PR c++/11987 + +template <int dim> struct X { + struct I { I(); }; +}; + +template <int dim> struct Y : X<dim> { + typedef typename X<dim>::I I; +}; + +// note: I is nested type in X, not Y! +template <int dim> +Y<dim>::I::I () {} // { dg-error "dependent typedef" } +// { dg-error "no type|dependent type" "" { target *-*-* } 13 } + +template struct Y<1>; diff --git a/gcc/testsuite/g++.dg/parse/typename2.C b/gcc/testsuite/g++.dg/parse/typename2.C new file mode 100644 index 000000000..8878497ad --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename2.C @@ -0,0 +1,17 @@ +template<class T, class U> +struct UnaryReturn { + typedef T Type_t; +}; + +struct foo +{ + template <class T> + typename UnaryReturn<T, int>::Type_t + bar(); +}; + +template<class T> +struct UnaryReturn<T, int> { + typedef bool Type_t; +}; + diff --git a/gcc/testsuite/g++.dg/parse/typename3.C b/gcc/testsuite/g++.dg/parse/typename3.C new file mode 100644 index 000000000..ce6ecbef8 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename3.C @@ -0,0 +1,8 @@ +template <typename T> +struct D2 : public T::B { + typedef typename T::X::Y Y; + + void f () { + Y::f (); + } +}; diff --git a/gcc/testsuite/g++.dg/parse/typename4.C b/gcc/testsuite/g++.dg/parse/typename4.C new file mode 100644 index 000000000..529889df6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename4.C @@ -0,0 +1,7 @@ +// { dg-do compile } + +// Origin: Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de> + +// PR c++/9364: ICE processing typename with name error. + +void find(typename int&); // { dg-error "typename|void|expected" } diff --git a/gcc/testsuite/g++.dg/parse/typename5.C b/gcc/testsuite/g++.dg/parse/typename5.C new file mode 100644 index 000000000..36647519f --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename5.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> + +// PR c++/10553: ICE processing typename with context error. + +template <typename> struct A {}; + +template <typename> struct B +{ + typedef A<typename X::Y> C; // { dg-error "declared|invalid|no type|expected" } +}; diff --git a/gcc/testsuite/g++.dg/parse/typename6.C b/gcc/testsuite/g++.dg/parse/typename6.C new file mode 100644 index 000000000..dc458bee5 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename6.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// Contributed by Matt Austern <austern at apple dot com> +// PR c++/13407: Gracefully handle keyword typename in base class specifier. + +struct A { }; +struct B { typedef A Type; }; + +template <typename T> +struct X : + public typename T::Type // { dg-error "not allowed in this context" } +{ }; + +X<B> x; + +struct C : + public typename A // { dg-error "not allowed outside of templates" } +{ }; diff --git a/gcc/testsuite/g++.dg/parse/typename7.C b/gcc/testsuite/g++.dg/parse/typename7.C new file mode 100644 index 000000000..2d823f807 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename7.C @@ -0,0 +1,33 @@ +// { dg-do compile } + +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> and +// Alexandre Oliva <aoliva@redhat.com> + +// PR c++/18757: ICE in get_innermost_template_args + +struct A +{ + template<typename> void foo(int); // { dg-message "note" } + template<typename T> void bar(T t) { // { dg-message "note" } + this->foo<typename T>(t); } // { dg-error "expected|parse error|no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 12 } + template<typename T> void bad(T t) { + foo<typename T>(t); } // { dg-error "expected|parse error|no matching" } +}; + +template <typename T> +struct B +{ + void bar(T t) { + A().bar<typename T>(t); } // { dg-error "expected|parse error|no matching" } + // { dg-message "candidate" "candidate note" { target *-*-* } 22 } + void bad(T t) { + B<typename T>::bar(t); } // { dg-error "invalid|not a template" } +}; + +void baz() +{ + A().bar(0); + A().bad(0); + B<int>().bar(0); +} diff --git a/gcc/testsuite/g++.dg/parse/typename8.C b/gcc/testsuite/g++.dg/parse/typename8.C new file mode 100644 index 000000000..e8e762709 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename8.C @@ -0,0 +1,11 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 12 Oct 2005 <nathan@codesourcery.com> + +// PR 23797:ICE +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +// { dg-options "-fpermissive -w" } + +struct A { typedef int X; }; + +int i = typename A::X(); diff --git a/gcc/testsuite/g++.dg/parse/typename9.C b/gcc/testsuite/g++.dg/parse/typename9.C new file mode 100644 index 000000000..8d7707219 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typename9.C @@ -0,0 +1,6 @@ +// check that using a qualified name with a typename does +// not report an error. + +struct A { typedef int X; }; + +int i = typename A::X(); diff --git a/gcc/testsuite/g++.dg/parse/typespec1.C b/gcc/testsuite/g++.dg/parse/typespec1.C new file mode 100644 index 000000000..44ee116f6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/typespec1.C @@ -0,0 +1,4 @@ +// PR c++/26571 + +struct A {}; +unsigned A a; // { dg-error "expected initializer" } diff --git a/gcc/testsuite/g++.dg/parse/undefined1.C b/gcc/testsuite/g++.dg/parse/undefined1.C new file mode 100644 index 000000000..0ae4e8877 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined1.C @@ -0,0 +1,10 @@ +// PR c++/8143 +// { dg-do compile } + +struct foo +{ + X x; // { dg-error "" } + + foo(X) {} // { dg-error "" } + foo(X y, int) : x() {} // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/undefined2.C b/gcc/testsuite/g++.dg/parse/undefined2.C new file mode 100644 index 000000000..a7e76f1b7 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined2.C @@ -0,0 +1,12 @@ +// PR c++/9173 +// Origin: <wwieser@gmx.de> +// { dg-do compile } + +class A {}; + +class B +{ + void foo(int,A::X); // { dg-error "" } +}; + +void B::foo(int,A::X) {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/undefined3.C b/gcc/testsuite/g++.dg/parse/undefined3.C new file mode 100644 index 000000000..6bafd6fc6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined3.C @@ -0,0 +1,6 @@ +// PR c++/5657 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template<typename T> struct A { A(B); }; +template<typename T> A<T>::A(B) {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/undefined4.C b/gcc/testsuite/g++.dg/parse/undefined4.C new file mode 100644 index 000000000..0bdc188d6 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined4.C @@ -0,0 +1,11 @@ +// PR c++/5665 +// Origin: Bergur Ragnarsson <bergur@tern.is> +// Reduced version: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +template<typename T> class A +{ + class B { X foo(); }; // { dg-error "" } +}; + +template<typename T> X A<T>::B::foo() {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/undefined5.C b/gcc/testsuite/g++.dg/parse/undefined5.C new file mode 100644 index 000000000..f1dba6e48 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined5.C @@ -0,0 +1,5 @@ +// PR c++/5975 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +typedef typename X::Y<> y; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/undefined6.C b/gcc/testsuite/g++.dg/parse/undefined6.C new file mode 100644 index 000000000..bc8a86d15 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined6.C @@ -0,0 +1,6 @@ +// PR c++/8596 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <int i> struct A {}; +template <int i> struct B : A<x>{}; // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/undefined7.C b/gcc/testsuite/g++.dg/parse/undefined7.C new file mode 100644 index 000000000..1a525fc65 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/undefined7.C @@ -0,0 +1,5 @@ +// PR c++/9228 +// Origin: Wolfgang Bangerth <bangerth@ticam.utexas.edu> +// { dg-do compile } + +template <typename T> typename A<T>::B foo() {} // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/using1.C b/gcc/testsuite/g++.dg/parse/using1.C new file mode 100644 index 000000000..efe7a0e31 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/using1.C @@ -0,0 +1 @@ +namespace A { using ::B; } // { dg-error "" } diff --git a/gcc/testsuite/g++.dg/parse/using2.C b/gcc/testsuite/g++.dg/parse/using2.C new file mode 100644 index 000000000..bfdb09f88 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/using2.C @@ -0,0 +1,8 @@ +namespace N { + template <typename T> + struct foo {}; +} + +int main() { + using N::foo<double>; // { dg-error "" } +} diff --git a/gcc/testsuite/g++.dg/parse/using3.C b/gcc/testsuite/g++.dg/parse/using3.C new file mode 100644 index 000000000..c266b68ea --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/using3.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 6 Sep 2003 <nathan@codesourcery.com> +// Origin: stefaandr@hotmail.com + +// PR c++/11794. Using decl in nested classes of a template class + +template <typename T> struct a +{ + struct a1: T + { + using T::aa; + + a1() { aa = 5; } + }; +}; +struct b { int aa; }; +template <> struct a<int>::a1 { a1 () {} }; + +a<b>::a1 a_b; +a<int>::a1 a_i; diff --git a/gcc/testsuite/g++.dg/parse/varmod1.C b/gcc/testsuite/g++.dg/parse/varmod1.C new file mode 100644 index 000000000..d64f04b78 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/varmod1.C @@ -0,0 +1,7 @@ +int main(int argc, char** argv) { + int nx = 2; + void theerror(double a[][nx+1]); // { dg-message "" } + double** a; + theerror(a); + return 0; +} diff --git a/gcc/testsuite/g++.dg/parse/wrong-inline1.C b/gcc/testsuite/g++.dg/parse/wrong-inline1.C new file mode 100644 index 000000000..22b9a9768 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/wrong-inline1.C @@ -0,0 +1,12 @@ +// PR c++/5921 +// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de> +// { dg-do compile } + +struct A +{ + struct B { B(); }; +}; + +static A::B b; + +inline template <int i> void f (); // { dg-error "" } |