[patch] Don't compute a "patched" storage class

Rafael EspĂ­ndola rafael.espindola at gmail.com
Wed Apr 3 09:19:14 PDT 2013


> The template "funcT1" is not a previous declaration of the specialization B::funcT1<int>. But to figure out that the specialization B::funcT1<int> is static we either need the specialization itself to be marked static or we need to walk through getTemplateSpecializationInfo. The member specialization info is for something like:

What is going on is that if a template has static storage class, we
say that the instantiated function has it too. So for example, if I
comment out the call to getTemplateSpecializationInfo, we fail to
compile

struct B {  template <class T> static void funcT1(); };
template <class T> void B::funcT1() {}
void test() {  B::funcT1<int>(); }

but can still compile

struct B {  template <class T> static void funcT1(); };
void test() {  B::funcT1<int>(); }

because there is a static to be copied in this case. Similarly, the
instantiated function in

template<typename T>
struct C {  static void funcT2(); };
template<typename T> void C<T>::funcT2(){}
void test() { C<int>::funcT2(); }

gets marked as static.

Looks like "as written" is a somewhat fuzzy concept for
instantiations. Maybe it would be more regular to say that a
instantiated function gets a static storage class if the template
isStatic()? That should allow us to remove the
getTemplateSpecializationInfo in isStatic().

>         - Doug

Cheers,
Rafael




More information about the cfe-commits mailing list