From 222e2a7620e6520ffaf4fc4e69d79c18da31542e Mon Sep 17 00:00:00 2001 From: "Zancanaro; Carlo" Date: Mon, 24 Sep 2012 09:58:17 +1000 Subject: Add the clang library to the repo (with some of my changes, too). --- .../temp/temp.res/temp.dep.res/temp.point/p1.cpp | 32 +++++++++++++ clang/test/CXX/temp/temp.res/temp.dep/p3.cpp | 43 ++++++++++++++++++ .../temp.res/temp.dep/temp.dep.constexpr/p2-0x.cpp | 27 +++++++++++ .../temp.res/temp.dep/temp.dep.constexpr/p2.cpp | 21 +++++++++ .../temp/temp.res/temp.dep/temp.dep.type/p1.cpp | 30 ++++++++++++ clang/test/CXX/temp/temp.res/temp.local/p1.cpp | 32 +++++++++++++ clang/test/CXX/temp/temp.res/temp.local/p3.cpp | 32 +++++++++++++ clang/test/CXX/temp/temp.res/temp.local/p7.cpp | 10 ++++ clang/test/CXX/temp/temp.res/temp.local/p8.cpp | 53 ++++++++++++++++++++++ clang/test/CXX/temp/temp.res/temp.local/p9.cpp | 15 ++++++ 10 files changed, 295 insertions(+) create mode 100644 clang/test/CXX/temp/temp.res/temp.dep.res/temp.point/p1.cpp create mode 100644 clang/test/CXX/temp/temp.res/temp.dep/p3.cpp create mode 100644 clang/test/CXX/temp/temp.res/temp.dep/temp.dep.constexpr/p2-0x.cpp create mode 100644 clang/test/CXX/temp/temp.res/temp.dep/temp.dep.constexpr/p2.cpp create mode 100644 clang/test/CXX/temp/temp.res/temp.dep/temp.dep.type/p1.cpp create mode 100644 clang/test/CXX/temp/temp.res/temp.local/p1.cpp create mode 100644 clang/test/CXX/temp/temp.res/temp.local/p3.cpp create mode 100644 clang/test/CXX/temp/temp.res/temp.local/p7.cpp create mode 100644 clang/test/CXX/temp/temp.res/temp.local/p8.cpp create mode 100644 clang/test/CXX/temp/temp.res/temp.local/p9.cpp (limited to 'clang/test/CXX/temp/temp.res') diff --git a/clang/test/CXX/temp/temp.res/temp.dep.res/temp.point/p1.cpp b/clang/test/CXX/temp/temp.res/temp.dep.res/temp.point/p1.cpp new file mode 100644 index 0000000..75580d2 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.dep.res/temp.point/p1.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// XFAIL: * + +// Note: we fail this test because we perform template instantiation +// at the end of the translation unit, so argument-dependent lookup +// finds functions that occur after the point of instantiation. Note +// that GCC fails this test; EDG passes the test in strict mode, but +// not in relaxed mode. +namespace N { + struct A { }; + struct B : public A { }; + + int& f0(A&); +} + +template +struct X0 { + void test_f0(T t) { + Result r = f0(t); + }; +}; + +void test_f0() { + X0 xA; + xA.test_f0(N::A()); + X0 xB; + xB.test_f0(N::B()); +} + +namespace N { + char& f0(B&); +} diff --git a/clang/test/CXX/temp/temp.res/temp.dep/p3.cpp b/clang/test/CXX/temp/temp.res/temp.dep/p3.cpp new file mode 100644 index 0000000..c41a4c6 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.dep/p3.cpp @@ -0,0 +1,43 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +struct A0 { + struct K { }; +}; + +template struct B0: A0 { + static void f() { + K k; + } +}; + +namespace E1 { + typedef double A; + + template class B { + typedef int A; + }; + + template + struct X : B { + A* blarg(double *dp) { + return dp; + } + }; +} + +namespace E2 { + struct A { + struct B; + int *a; + int Y; + }; + + int a; + template struct Y : T { + struct B { /* ... */ }; + B b; + void f(int i) { a = i; } + Y* p; + }; + + Y ya; +} diff --git a/clang/test/CXX/temp/temp.res/temp.dep/temp.dep.constexpr/p2-0x.cpp b/clang/test/CXX/temp/temp.res/temp.dep/temp.dep.constexpr/p2-0x.cpp new file mode 100644 index 0000000..0aba402 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.dep/temp.dep.constexpr/p2-0x.cpp @@ -0,0 +1,27 @@ +// RUN: %clang_cc1 -std=c++11 -verify %s + +template struct S; + +template struct T { + T() { + // An identifier is value-dependent if it is: + // - a name declared with a dependent type + S s; + S check1; // ok, s is value-dependent + // - the name of a non-type template parameter + typename S::T check2; // ok, n is value-dependent + // - a constant with literal type and is initialized with an expression + // that is value-dependent. + const int k = n; + typename S::T check3a; // ok, u is value-dependent + + constexpr const int *p = &k; + typename S<*p>::T check3b; // ok, p is value-dependent + + // (missing from the standard) + // - a reference and is initialized with an expression that is + // value-dependent. + const int &i = k; + typename S::T check4; // ok, i is value-dependent + } +}; diff --git a/clang/test/CXX/temp/temp.res/temp.dep/temp.dep.constexpr/p2.cpp b/clang/test/CXX/temp/temp.res/temp.dep/temp.dep.constexpr/p2.cpp new file mode 100644 index 0000000..68a41c7 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.dep/temp.dep.constexpr/p2.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -std=c++98 -verify %s + +template struct S; + +template struct T { + T() { + // An identifier is value-dependent if it is: + // - a name declared with a dependent type + S s; + S check1; // ok, s is value-dependent + // - the name of a non-type template parameter + typename S::T check2; // ok, n is value-dependent + // - a constant with literal type and is initialized with an expression + // that is value-dependent. + const int k = n; + typename S::T check3; // ok, u is value-dependent + + const int &i = k; + typename S::T check4; // expected-error {{not an integral constant expression}} expected-error {{qualified name}} + } +}; diff --git a/clang/test/CXX/temp/temp.res/temp.dep/temp.dep.type/p1.cpp b/clang/test/CXX/temp/temp.res/temp.dep/temp.dep.type/p1.cpp new file mode 100644 index 0000000..81b070f --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.dep/temp.dep.type/p1.cpp @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s + +// Examples from CWG1056. +namespace Example1 { + template struct A; + template using B = A; + + template struct A { + struct C {}; + B::C bc; // ok, B is the current instantiation. + }; + + template struct A> { + struct C {}; + B>::C bc; // ok, B> is the current instantiation. + }; + + template struct A>> { + struct C {}; + B>::C bc; // expected-error {{missing 'typename'}} + }; +} + +namespace Example2 { + template struct A { + void g(); + }; + template using B = A; + template void B::g() {} // ok. +} diff --git a/clang/test/CXX/temp/temp.res/temp.local/p1.cpp b/clang/test/CXX/temp/temp.res/temp.local/p1.cpp new file mode 100644 index 0000000..1ad4464 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.local/p1.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +// C++0x [temp.local]p1: +// Like normal (non-template) classes, class templates have an +// injected-class-name (Clause 9). The injected-class-name can be used with +// or without a template-argument-list. When it is used without +// a template-argument-list, it is equivalent to the injected-class-name +// followed by the template-parameters of the class template enclosed in <>. + +template struct X0 { + X0(); + ~X0(); + X0 f(const X0&); +}; + +// Test non-type template parameters. +template struct X1 { + X1(); + ~X1(); + X1 f(const X1& x1a) { X1 x1b(x1a); return x1b; } +}; + +// When it is used with a template-argument-list, it refers to the specified +// class template specialization, which could be the current specialization +// or another specialization. +// FIXME: Test this clause. + +int i = 42; +void test() { + X0 x0; (void)x0; + X1<42, i, &i> x1; (void)x1; +} diff --git a/clang/test/CXX/temp/temp.res/temp.local/p3.cpp b/clang/test/CXX/temp/temp.res/temp.local/p3.cpp new file mode 100644 index 0000000..54da885 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.local/p3.cpp @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -verify %s + +template struct Base { // expected-note 4 {{member found by ambiguous name lookup}} + static void f(); +}; + +struct X0 { }; + +template struct Derived: Base, Base { + typename Derived::Base b; // expected-error{{member 'Base' found in multiple base classes of different types}} + typename Derived::Base d; // OK + + void g(X0 *t) { + t->Derived::Base::f(); + t->Base::f(); + t->Base::f(); // expected-error{{member 'Base' found in multiple base classes of different types}} \ + // expected-error{{no member named 'f' in 'X0'}} \ + // expected-error{{expected a class or namespace}} + } +}; + +namespace PR6717 { + template + class WebVector { + } // expected-error {{expected ';' after class}} + + WebVector(const WebVector& other) { } // expected-error{{undeclared identifier 'T'}} \ + expected-error{{requires a type specifier}} + + template + WebVector& operator=(const C& other) { } // expected-error{{undeclared identifier 'T'}} +} diff --git a/clang/test/CXX/temp/temp.res/temp.local/p7.cpp b/clang/test/CXX/temp/temp.res/temp.local/p7.cpp new file mode 100644 index 0000000..bd05e75 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.local/p7.cpp @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +template struct A { + int B; + int f(); +}; + +template int A::f() { + return B; +} diff --git a/clang/test/CXX/temp/temp.res/temp.local/p8.cpp b/clang/test/CXX/temp/temp.res/temp.local/p8.cpp new file mode 100644 index 0000000..5d9d509 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.local/p8.cpp @@ -0,0 +1,53 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +namespace N { + enum { C }; + template class B { + void f(T); + }; +} + +template void N::B::f(C) { + C b; +} + +namespace N { + enum { D }; + namespace M { + enum { C , D }; + template class X { + template void f(C, U); + + template void g(C, D) { + C c; + D d; + } + }; + + struct Y { + template void f(U); + }; + } + + struct Y { + template void f(D); + }; +} + +template +template +void N::M::X::f(C, D) { + C c; + D d; +} + +template +void N::M::Y::f(C) { + C c; +} + +template +void N::Y::f(D) { + D d; +} + diff --git a/clang/test/CXX/temp/temp.res/temp.local/p9.cpp b/clang/test/CXX/temp/temp.res/temp.local/p9.cpp new file mode 100644 index 0000000..9ca8d88 --- /dev/null +++ b/clang/test/CXX/temp/temp.res/temp.local/p9.cpp @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +struct A { + struct B { void f(); }; + int a; + int Y; +}; + +template struct X : A { + B b; // A's B + a c; // expected-error{{unknown type name 'a'}} + + void g() { + b.g(); // expected-error{{no member named 'g' in 'A::B'}} + } +}; -- cgit v1.2.3