From a27b6b1a783673217cb6ff0154f9563051ccaf5b Mon Sep 17 00:00:00 2001 From: Giovanni Bajo Date: Tue, 17 Feb 2004 01:46:00 +0000 Subject: [PATCH] dr101.C, [...]: New tests. * g++.dg/tc1/dr101.C, g++.dg/tc1/dr135.C, g++.dg/tc1/dr142.C, g++.dg/tc1/dr152.C, g++.dg/tc1/dr159.C, g++.dg/tc1/dr161.C, g++.dg/tc1/dr166.C, g++.dg/tc1/dr176.C, g++.dg/tc1/dr188.C, g++.dg/tc1/dr193.C, g++.dg/tc1/dr194.C, g++.dg/tc1/dr217.C, g++.dg/tc1/dr48.C, g++.dg/tc1/dr56.C, g++.dg/tc1/dr68.C, g++.dg/tc1/dr76.C, g++.dg/tc1/dr80.C, g++.dg/tc1/dr94.C: New tests. From-SVN: r77943 --- gcc/testsuite/ChangeLog | 9 ++++ gcc/testsuite/g++.dg/tc1/dr101.C | 31 ++++++++++++++ gcc/testsuite/g++.dg/tc1/dr135.C | 8 ++++ gcc/testsuite/g++.dg/tc1/dr142.C | 32 ++++++++++++++ gcc/testsuite/g++.dg/tc1/dr152.C | 36 ++++++++++++++++ gcc/testsuite/g++.dg/tc1/dr159.C | 12 ++++++ gcc/testsuite/g++.dg/tc1/dr161.C | 50 ++++++++++++++++++++++ gcc/testsuite/g++.dg/tc1/dr166.C | 60 ++++++++++++++++++++++++++ gcc/testsuite/g++.dg/tc1/dr176.C | 29 +++++++++++++ gcc/testsuite/g++.dg/tc1/dr188.C | 9 ++++ gcc/testsuite/g++.dg/tc1/dr193.C | 72 ++++++++++++++++++++++++++++++++ gcc/testsuite/g++.dg/tc1/dr194.C | 16 +++++++ gcc/testsuite/g++.dg/tc1/dr217.C | 14 +++++++ gcc/testsuite/g++.dg/tc1/dr48.C | 13 ++++++ gcc/testsuite/g++.dg/tc1/dr56.C | 12 ++++++ gcc/testsuite/g++.dg/tc1/dr68.C | 20 +++++++++ gcc/testsuite/g++.dg/tc1/dr76.C | 8 ++++ gcc/testsuite/g++.dg/tc1/dr80.C | 53 +++++++++++++++++++++++ gcc/testsuite/g++.dg/tc1/dr94.C | 9 ++++ 19 files changed, 493 insertions(+) create mode 100644 gcc/testsuite/g++.dg/tc1/dr101.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr135.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr142.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr152.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr159.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr161.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr166.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr176.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr188.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr193.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr194.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr217.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr48.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr56.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr68.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr76.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr80.C create mode 100644 gcc/testsuite/g++.dg/tc1/dr94.C diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 86a946d2091..35b9eb848a8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2004-02-16 Giovanni Bajo + + * g++.dg/tc1/dr101.C, g++.dg/tc1/dr135.C, g++.dg/tc1/dr142.C, + g++.dg/tc1/dr152.C, g++.dg/tc1/dr159.C, g++.dg/tc1/dr161.C, + g++.dg/tc1/dr166.C, g++.dg/tc1/dr176.C, g++.dg/tc1/dr188.C, + g++.dg/tc1/dr193.C, g++.dg/tc1/dr194.C, g++.dg/tc1/dr217.C, + g++.dg/tc1/dr48.C, g++.dg/tc1/dr56.C, g++.dg/tc1/dr68.C, + g++.dg/tc1/dr76.C, g++.dg/tc1/dr80.C, g++.dg/tc1/dr94.C: New tests. + 2004-02-16 Eric Botcazou * gcc.c-torture/execute/20020720-1.x: XFAIL on SPARC with -fPIC. diff --git a/gcc/testsuite/g++.dg/tc1/dr101.C b/gcc/testsuite/g++.dg/tc1/dr101.C new file mode 100644 index 00000000000..79cb1b0ebe3 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr101.C @@ -0,0 +1,31 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR101: Redeclaration of extern "C" names via using-declarations + +namespace Test1 { + + typedef unsigned int X; + extern "C" void f1(); + namespace N { + typedef unsigned int X; + extern "C" void f1(); + } + using N::f1; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" } + using N::X; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" } +} + + +namespace Test2 { + + typedef unsigned int X; + extern "C" int f2(); + namespace N { + typedef unsigned int X; + extern "C" int f2(); + } + using namespace N; + int i = f2(); // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" } + X x; // { dg-bogus "" "redeclaration through 'using' should not be ambiguous" { xfail *-*-* } } + +} + diff --git a/gcc/testsuite/g++.dg/tc1/dr135.C b/gcc/testsuite/g++.dg/tc1/dr135.C new file mode 100644 index 00000000000..91a7727e375 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr135.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR135: Class type in in-class member function definitions + +struct S { + S f() { return S(); } // { dg-bogus "" "incomplete class type is allowed as return type" } + void g(S) { } // { dg-bogus "" "incomplete class type is allowed as parameter type" } +}; diff --git a/gcc/testsuite/g++.dg/tc1/dr142.C b/gcc/testsuite/g++.dg/tc1/dr142.C new file mode 100644 index 00000000000..6043c3d87e2 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr142.C @@ -0,0 +1,32 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR142: Injection-related errors in access example + +class B { // { dg-error "inaccessible" } +public: + int mi; // { dg-error "inaccessible" } + static int si; // { dg-error "inaccessible" } +}; + +class D: private B { +}; + +class DD: public D { + void f(); +}; + +void DD::f() { + mi = 3; // { dg-error "within this context" "" } + si = 3; // { dg-error "within this context" "" } + ::B b; + b.mi = 3; + b.si = 3; + ::B::si = 3; + ::B* bp1 = this; // { dg-error "inaccessible base" "" } + ::B* bp2 = (::B*)this; + bp2->mi = 3; + + + B b2; // { dg-error "within this context" "" } + B::si = 3; // { dg-error "within this context" "" } +} diff --git a/gcc/testsuite/g++.dg/tc1/dr152.C b/gcc/testsuite/g++.dg/tc1/dr152.C new file mode 100644 index 00000000000..23c73b5e4e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr152.C @@ -0,0 +1,36 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR152: explicit copy constructors + +namespace N1 { + struct X { + X(); + explicit X(const X&); + }; + void f(X); + int foo() + { + X x; + f(x); // { dg-error "" "" } + } +} + +namespace N2 { + template + struct X { + X(); + explicit X(const X&); + }; + + template + void f(T ) {} + + template + int foo() + { + X x; + N2::f(x); // { dg-error "" "" } + } + + template int foo(); // { dg-error "instantiated from here" } +} diff --git a/gcc/testsuite/g++.dg/tc1/dr159.C b/gcc/testsuite/g++.dg/tc1/dr159.C new file mode 100644 index 00000000000..6d04921f7cd --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr159.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR159: Namespace qualification in declarators + +namespace N { + namespace M { + void f(); + void g(); + } + void M::f(){} + void N::M::g(){} +} diff --git a/gcc/testsuite/g++.dg/tc1/dr161.C b/gcc/testsuite/g++.dg/tc1/dr161.C new file mode 100644 index 00000000000..f08935354f8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr161.C @@ -0,0 +1,50 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR161: Access to protected nested type + +namespace N1 { + struct A + { + protected: + typedef int type; + }; + + struct B : public A + { + void test(void) + { + A::type t; + } + + friend void ftest(void) + { + A::type t; + } + }; +} + + +namespace N2 { + template + struct A + { + protected: + typedef int type; + }; + + template + struct B : public A + { + void test(B b) + { + typename A::type t; + } + + friend void ftest(B b) + { + typename A::type t; + } + }; + + template struct B; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr166.C b/gcc/testsuite/g++.dg/tc1/dr166.C new file mode 100644 index 00000000000..6f2a26df501 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr166.C @@ -0,0 +1,60 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR166: Friend declarations of template-ids + +namespace N { + template void f(T); + void g(); + + namespace M { + class A { + friend void f(int); // N::f + static int x; // { dg-error "private" } + }; + + class B { + template friend void f(T); // M::f + static int x; // { dg-error "private" } + }; + + class C { + friend void g(); // M::g + static int x; // { dg-error "private" } + }; + + template void f(T) // will be instantiated as f + { + M::A::x = 0; // { dg-error "within this context" } + M::B::x = 0; + } + template <> void f(int) + { M::A::x = 0; } // { dg-error "within this context" } + template <> void f(double ) + { + M::B::x = 0; + M::f(0); // { dg-error "instantiated" } + } + + void g(void) + { M::C::x = 0; } + } + + template void f(T) // will be instantiated as f + { + M::A::x = 0; // { dg-error "within this context" } + M::B::x = 0; // { dg-error "within this context" } + } + + template <> void f(int ) + { + N::f(0); // { dg-error "instantiated" } + M::A::x = 0; + M::B::x = 0; // { dg-error "within this context" } + } + + template <> void f(char ) + { M::A::x = 0; } // { dg-error "within this context" } + + void g(void) + { M::C::x = 0; } // { dg-error "within this context" } +} diff --git a/gcc/testsuite/g++.dg/tc1/dr176.C b/gcc/testsuite/g++.dg/tc1/dr176.C new file mode 100644 index 00000000000..b308ad8693b --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr176.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR176: Name injection and templates + +namespace N1 { + template struct Base { + Base* p; + Base* p2; + ::Base* p3; // { dg-error "" "" } + }; + + template struct Derived: public Base { + Base* p; // { dg-bogus "" "injected class name in derived classes" { xfail *-*-* } } + Base* p2; + typename Derived::Base* p3; // { dg-bogus "" "injected class name in derived classes" { xfail *-*-* } } + }; + + template struct Derived; // { dg-bogus "instantiated from here" "everything should be looked up at parsing time (after DR224)" { xfail *-*-* } } +} + + +namespace N2 { + template struct Base {}; + template struct Derived: public Base { + typename Derived::template Base* p1; // { dg-bogus "" "" { xfail *-*-* } } + } + + template struct Derived; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr188.C b/gcc/testsuite/g++.dg/tc1/dr188.C new file mode 100644 index 00000000000..3a10fa47626 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr188.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR188: Comma operator and rvalue conversion + +template struct StaticAssert; +template <> struct StaticAssert {}; + +char arr[100]; +StaticAssert<(sizeof(0,arr) == 100)> check; diff --git a/gcc/testsuite/g++.dg/tc1/dr193.C b/gcc/testsuite/g++.dg/tc1/dr193.C new file mode 100644 index 00000000000..1319b884aa7 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr193.C @@ -0,0 +1,72 @@ +// { dg-do run } +// Origin: Giovanni Bajo +// DR193: Order of destruction of local automatics of destructor + +extern "C" void abort(void); + +namespace N1 { + bool a_done = false; + struct A + { + ~A() + { + a_done = true; + } + }; + + struct B + { + ~B() + { + if (!a_done) + abort(); + } + }; + + struct C { + B x; + ~C() { + A y; + }; + }; +} + + +namespace N2 { + bool a_done = false; + + template + struct A + { + ~A() + { + a_done = true; + } + }; + + template + struct B + { + ~B() + { + if (!a_done) + abort(); + } + }; + + template + struct C { + B x; + ~C() { + A y; + }; + }; +} + + +int main(void) +{ + N1::C c1; + N2::C c2; + return 0; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr194.C b/gcc/testsuite/g++.dg/tc1/dr194.C new file mode 100644 index 00000000000..3491468b74e --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr194.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR194: Identifying constructors + +struct A +{ + inline explicit A(); +}; + +template +struct B +{ + inline explicit B(); +}; + +template struct B; diff --git a/gcc/testsuite/g++.dg/tc1/dr217.C b/gcc/testsuite/g++.dg/tc1/dr217.C new file mode 100644 index 00000000000..1fb3ce29ba8 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr217.C @@ -0,0 +1,14 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR217: Default arguments for non-template member functions of class +// templates + +template +struct S +{ + void foo (int); +}; + +template +void S::foo (int = 0) // { dg-error "" "default arguments for parameters of member functions of class templates can be specified in the initial declaration only" { xfail *-*-* } } +{ } diff --git a/gcc/testsuite/g++.dg/tc1/dr48.C b/gcc/testsuite/g++.dg/tc1/dr48.C new file mode 100644 index 00000000000..16732d2dad2 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr48.C @@ -0,0 +1,13 @@ +// { dg-do link } +// Origin: Giovanni Bajo +// DR48: Definitions of unused static members + +struct A { + static const int size = 10; + int array[size]; +}; + +int main() { + A a; + return 0; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr56.C b/gcc/testsuite/g++.dg/tc1/dr56.C new file mode 100644 index 00000000000..1451ce8cf93 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr56.C @@ -0,0 +1,12 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR56: Redeclaring typedefs within classes + +class X { + typedef int I; + typedef int I; // { dg-error "" "Cannot redeclare a typedef in a class scope" { xfail *-*-* } } +}; + +// In non-class scope, they are allowed. +typedef int A; +typedef int A; diff --git a/gcc/testsuite/g++.dg/tc1/dr68.C b/gcc/testsuite/g++.dg/tc1/dr68.C new file mode 100644 index 00000000000..60b2c6b6c84 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr68.C @@ -0,0 +1,20 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR68: Grammar does not allow "friend class A;" + +namespace A{ + class B{}; +} + +namespace B{ + class A{}; + class C{ + friend class ::A::B; + }; +} + + +template class K; +class J { + friend class K; +}; diff --git a/gcc/testsuite/g++.dg/tc1/dr76.C b/gcc/testsuite/g++.dg/tc1/dr76.C new file mode 100644 index 00000000000..dfe7ecf80c2 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr76.C @@ -0,0 +1,8 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR76: Are const volatile variables considered "constant expressions"? + +volatile const int a = 5; + +template struct K; +template struct K; // { dg-error "non-constant" } diff --git a/gcc/testsuite/g++.dg/tc1/dr80.C b/gcc/testsuite/g++.dg/tc1/dr80.C new file mode 100644 index 00000000000..e7d373169be --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr80.C @@ -0,0 +1,53 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR80: Class members with same name as class + +struct A +{ + int A; +}; + +struct A2 +{ + static int A2; // { dg-error "same name as" } +}; + + +template +struct A3 +{ + int A3; +}; + +template +struct A4 +{ + static int A4; // { dg-error "same name as" } +}; + + +struct B +{ + B(); + int B; // { dg-error "same name as" } +}; + +struct B2 +{ + B2(); + static int B2; // { dg-error "same name as" } +}; + +template +struct B3 +{ + B3(); + int B3; // { dg-error "same name as" "this error should appear at parsing time" { xfail *-*-* } } +}; + +template +struct B4 +{ + B4(); + static int B4; // { dg-error "same name as" } +}; diff --git a/gcc/testsuite/g++.dg/tc1/dr94.C b/gcc/testsuite/g++.dg/tc1/dr94.C new file mode 100644 index 00000000000..3909c655453 --- /dev/null +++ b/gcc/testsuite/g++.dg/tc1/dr94.C @@ -0,0 +1,9 @@ +// { dg-do compile } +// Origin: Giovanni Bajo +// DR94: Inconsistencies in the descriptions of constant expressions + +struct S { + static const int c = 5; +}; +int a[S::c]; +