File: copy-ctor-template.cpp

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.6-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,245,028 kB
  • sloc: cpp: 7,619,726; ansic: 1,434,018; asm: 1,058,748; python: 252,740; f90: 94,671; objc: 70,685; lisp: 42,813; pascal: 18,401; sh: 8,601; ml: 5,111; perl: 4,720; makefile: 3,675; awk: 3,523; javascript: 2,409; xml: 892; fortran: 770
file content (29 lines) | stat: -rw-r--r-- 951 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// RUN: %clang_cc1 -fsyntax-only -verify %s

template<class T, class V>
struct A{
    A(); // expected-note{{candidate constructor not viable: requires 0 arguments, but 1 was provided}}
    A(A&); // expected-note{{candidate constructor not viable: expects an lvalue for 1st argument}} 
    A(A<V, T>); // expected-error{{copy constructor must pass its first argument by reference}}
};

void f() {
    A<int, int> a = A<int, int>(); // expected-note{{in instantiation of template class 'A<int, int>'}} 
    A<int, double> a1 = A<double, int>(); // No error (not a copy constructor)
}

// Test rvalue-to-lvalue conversion in copy constructor
A<int, int> &&a(void);
void g() {
    A<int, int> a2 = a(); // expected-error{{no matching constructor}}
}

template<class T, class V>
struct B{
    B();
    template<class U> B(U); // No error (templated constructor)
};

void h() {
    B<int, int> b = B<int, int>(); // should use implicit copy constructor
}