1 // { dg-options "-std=gnu++0x" } 2 template<typename T> struct add_pointer; 3 template<typename T> struct add_reference; 4 5 template<template<class T> class... Metafunctions> 6 struct metatuple { 7 static const int value = 0; 8 }; 9 10 template<> 11 struct metatuple<add_pointer> { 12 static const int value = 1; 13 }; 14 15 template<template<class T> class Meta> 16 struct metatuple<Meta, Meta> { // { dg-error "candidates" } 17 static const int value = 2; 18 }; 19 20 template<template<class T> class... Metafunctions> 21 struct metatuple<add_pointer, Metafunctions...> { // { dg-error "" } 22 static const int value = 3; 23 }; 24 25 template<template<class T> class First, 26 template<class T> class... Metafunctions> 27 struct metatuple<First, Metafunctions...> { // { dg-error "struct" } 28 static const int value = 4; 29 }; 30 31 template<template<class T> class First, 32 template<class T> class Second, 33 template<class T> class... Metafunctions> 34 struct metatuple<First, Second, Metafunctions...> { // { dg-error "struct" } 35 static const int value = 5; 36 }; 37 38 int a0[metatuple<>::value == 0? 1 : -1]; 39 int a1[metatuple<add_pointer>::value == 1? 1 : -1]; 40 int a2a[metatuple<add_pointer, add_pointer>::value == 2? 1 : -1]; // { dg-error "ambiguous|array bound" "bound" } 41 int a2b[metatuple<add_reference, add_reference>::value == 2? 1 : -1]; 42 int a3[metatuple<add_pointer, add_reference>::value == 3? 1 : -1]; // { dg-error "ambiguous|array bound" "bound" } 43 int a4[metatuple<add_reference>::value == 4? 1 : -1]; 44 int a5[metatuple<add_reference, add_pointer>::value == 5? 1 : -1]; 45 46 // { dg-error "incomplete" "incomplete" { target *-*-* } 40 } 47 // { dg-error "incomplete" "incomplete" { target *-*-* } 42 } 48