// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s // // This test checks that a deprecated attribute on an alias // template triggers a warning diagnostic when it is used. template struct NoAttr { void foo() {} }; // expected-note@+2 7{{'UsingWithAttr' has been explicitly marked deprecated here}} template using UsingWithAttr __attribute__((deprecated)) = NoAttr; // expected-note@+1 {{'UsingInstWithAttr' has been explicitly marked deprecated here}} using UsingInstWithAttr __attribute__((deprecated)) = NoAttr; // expected-note@+1 {{'TDWithAttr' has been explicitly marked deprecated here}} typedef NoAttr TDWithAttr __attribute__((deprecated)); // expected-warning@+1 {{'UsingWithAttr' is deprecated}} typedef UsingWithAttr TDUsingWithAttr; typedef NoAttr TDNoAttr; // expected-note@+1 {{'UsingTDWithAttr' has been explicitly marked deprecated here}} using UsingTDWithAttr __attribute__((deprecated)) = TDNoAttr; struct S { NoAttr f1; // expected-warning@+1 {{'UsingWithAttr' is deprecated}} UsingWithAttr f2; }; // expected-warning@+1 {{'UsingWithAttr' is deprecated}} void foo(NoAttr s1, UsingWithAttr s2) { } // expected-note@+2 {{'UsingWithCPPAttr' has been explicitly marked deprecated here}} template using UsingWithCPPAttr [[deprecated]] = NoAttr; // expected-note@+1 {{'UsingInstWithCPPAttr' has been explicitly marked deprecated here}} using UsingInstWithCPPAttr [[deprecated("Do not use this")]] = NoAttr; void bar() { NoAttr obj; // Okay // expected-warning@+2 {{'UsingWithAttr' is deprecated}} // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}} UsingWithAttr objUsingWA; // expected-warning@+2 {{'UsingWithAttr' is deprecated}} // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}} NoAttr> s; // expected-note@+1 {{'DepInt' has been explicitly marked deprecated here}} using DepInt [[deprecated]] = int; // expected-warning@+3 {{'UsingWithAttr' is deprecated}} // expected-warning@+2 {{'DepInt' is deprecated}} // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}} using X = UsingWithAttr; // expected-warning@+2 {{'UsingWithAttr' is deprecated}} // expected-note@+1 {{in instantiation of template type alias 'UsingWithAttr' requested here}} UsingWithAttr().foo(); // expected-warning@+1 {{'UsingInstWithAttr' is deprecated}} UsingInstWithAttr objUIWA; // expected-warning@+1 {{'TDWithAttr' is deprecated}} TDWithAttr objTDWA; // expected-warning@+1 {{'UsingTDWithAttr' is deprecated}} UsingTDWithAttr objUTDWA; // expected-warning@+2 {{'UsingWithCPPAttr' is deprecated}} // expected-note@+1 {{in instantiation of template type alias 'UsingWithCPPAttr' requested here}} UsingWithCPPAttr objUsingWCPPA; // expected-warning@+1 {{'UsingInstWithCPPAttr' is deprecated: Do not use this}} UsingInstWithCPPAttr objUICPPWA; }