diff options
| author | Francois Pichet <pichet2000@gmail.com> | 2011-04-13 02:38:49 +0000 |
|---|---|---|
| committer | Francois Pichet <pichet2000@gmail.com> | 2011-04-13 02:38:49 +0000 |
| commit | 48c946e5efee7db32efc70b7c9efcf453d217089 (patch) | |
| tree | 060dc0589412c1dd1f807276719eb866928fd8a8 /clang/test/SemaCXX/MicrosoftExtensions.cpp | |
| parent | bbe277c4a986f4836fc531c61adf6daa7dfdf1cf (diff) | |
| download | bcm5719-llvm-48c946e5efee7db32efc70b7c9efcf453d217089.tar.gz bcm5719-llvm-48c946e5efee7db32efc70b7c9efcf453d217089.zip | |
In Microsoft mode, within class scope, if a CXXScopeSpec's type is equal to the type of one of the base classes then downgrade the missing typename error to a warning. Up to now this is the only case I found where MSVC doesn't require "typename" at class scope. Really strange!
This fixes 1 error when parsing the MSVC 2008 header files.
Example:
template<class T> class A {
public:
typedef int TYPE;
};
template<class T> class B : public A<T> {
public:
A<T>::TYPE a; // no typename required because A<T> is a base class.
};
llvm-svn: 129425
Diffstat (limited to 'clang/test/SemaCXX/MicrosoftExtensions.cpp')
| -rw-r--r-- | clang/test/SemaCXX/MicrosoftExtensions.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/MicrosoftExtensions.cpp b/clang/test/SemaCXX/MicrosoftExtensions.cpp index 2287d26fa8f..c2a32b4c407 100644 --- a/clang/test/SemaCXX/MicrosoftExtensions.cpp +++ b/clang/test/SemaCXX/MicrosoftExtensions.cpp @@ -136,3 +136,35 @@ public: template <class T> void BB<T>::f(int g = 0) { } // expected-warning {{redefinition of default argument}} + +namespace MissingTypename { + +template<class T> class A { +public: + typedef int TYPE; +}; + +template<class T> class B { +public: + typedef int TYPE; +}; + + +template<class T, class U> +class C : private A<T>, public B<U> { +public: + typedef A<T> Base1; + typedef B<U> Base2; + typedef A<U> Base3; + + A<T>::TYPE a1; // expected-warning {{missing 'typename' prior to dependent type name}} + Base1::TYPE a2; // expected-warning {{missing 'typename' prior to dependent type name}} + + B<U>::TYPE a3; // expected-warning {{missing 'typename' prior to dependent type name}} + Base2::TYPE a4; // expected-warning {{missing 'typename' prior to dependent type name}} + + A<U>::TYPE a5; // expected-error {{missing 'typename' prior to dependent type name}} + Base3::TYPE a6; // expected-error {{missing 'typename' prior to dependent type name}} + }; + +}
\ No newline at end of file |

