teak-llvm/clang/test/SemaCXX/PR8755.cpp
Reid Kleckner 1a4ab7e772 Improve error message when referencing a non-tag type with a tag
Other compilers accept invalid code here that we reject, and we need a
better error message to try to convince users that the code is really
incorrect. Consider:
  class Foo {
    typedef MyIterHelper<Foo> iterator;
    friend class iterator;
  };

Previously our wording was "elaborated type refers to a typedef".
"elaborated type" isn't widely known terminology, so the new diagnostic
says "typedef 'iterator' cannot be referenced with class specifier".

Reviewers: rsmith

Differential Revision: https://reviews.llvm.org/D25216

llvm-svn: 289259
2016-12-09 19:47:58 +00:00

17 lines
377 B
C++

// RUN: %clang_cc1 -fsyntax-only -verify %s
template <typename T>
struct A {
typedef int iterator; // expected-note{{declared here}}
};
template <typename T>
void f() {
class A <T> ::iterator foo; // expected-error{{typedef 'iterator' cannot be referenced with a class specifier}}
}
void g() {
f<int>(); // expected-note{{in instantiation of function template}}
}