reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    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
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
// RUN: rm -rf %t
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -fno-modules-error-recovery -I %S/Inputs/template-default-args -std=c++11 %s -DBEGIN= -DEND=
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -verify -fmodules-cache-path=%t -fno-modules-error-recovery -I %S/Inputs/template-default-args -std=c++11 %s -DBEGIN="namespace N {" -DEND="}"

BEGIN
template<typename T> struct A;
template<typename T> struct B;
template<typename T> struct C;
template<typename T = int> struct D;
template<typename T = int> struct E {};
template<typename T> struct H {};
template<typename T = int, typename U = int> struct I {};
END

#include "b.h"
#include "d.h"

BEGIN
template<typename T = int> struct A {};
template<typename T> struct B {};
template<typename T = int> struct B;
template<typename T = int> struct C;
template<typename T> struct D {};
template<typename T> struct F {};
template<typename T> struct G {};
template<typename T> struct J {};
template<typename T = int> struct J;
struct K : J<> {};
END

#include "c.h"

BEGIN
A<> a;
B<> b;
extern C<> c;
D<> d;
E<> e;
F<> f;
G<> g; // expected-error {{default argument of 'G' must be imported from module 'X.A' before it is required}}
// expected-note@a.h:7 {{default argument declared here}}
H<> h; // expected-error {{default argument of 'H' must be imported from module 'X.A' before it is required}}
// expected-note@a.h:8 {{default argument declared here}}
I<> i;
L<> *l;
END

namespace DeferredLookup {
  template<typename T, typename U = T> using X = U;
  template<typename T> void f() { (void) X<T>(); }
  template<typename T> int n = X<T>(); // expected-warning {{extension}}
  template<typename T> struct S { X<T> xt; enum E : int; };
  template<typename T> enum S<T>::E : int { a = X<T>() };

  void test() {
    f<int>();
    n<int> = 1;
    S<int> s;
    S<int>::E e = S<int>::E::a;

    Indirect::B<int>::C<int> indirect;
  }
}