forked from OSchip/llvm-project
[microsoft] Move missing typename warning from -fms-extensions to -fms-compatibility. Also allow the missing typename warning at function scope.
llvm-svn: 140240
This commit is contained in:
parent
c1ef10f99e
commit
3b4de99158
|
@ -280,7 +280,7 @@ bool Sema::isMicrosoftMissingTypename(const CXXScopeSpec *SS) {
|
|||
if (Context.hasSameUnqualifiedType(QualType(Ty, 1), Base->getType()))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return CurContext->isFunctionOrMethod();
|
||||
}
|
||||
|
||||
bool Sema::DiagnoseUnknownTypeName(const IdentifierInfo &II,
|
||||
|
@ -362,7 +362,7 @@ bool Sema::DiagnoseUnknownTypeName(const IdentifierInfo &II,
|
|||
<< &II << DC << SS->getRange();
|
||||
else if (isDependentScopeSpecifier(*SS)) {
|
||||
unsigned DiagID = diag::err_typename_missing;
|
||||
if (getLangOptions().MicrosoftExt && isMicrosoftMissingTypename(SS))
|
||||
if (getLangOptions().MicrosoftMode && isMicrosoftMissingTypename(SS))
|
||||
DiagID = diag::warn_typename_missing;
|
||||
|
||||
Diag(SS->getRange().getBegin(), DiagID)
|
||||
|
|
|
@ -90,3 +90,47 @@ private:
|
|||
}
|
||||
|
||||
|
||||
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}}
|
||||
};
|
||||
|
||||
class D {
|
||||
public:
|
||||
typedef int Type;
|
||||
};
|
||||
|
||||
template <class T>
|
||||
void function_missing_typename()
|
||||
{
|
||||
const T::Type var = 2; // expected-warning {{missing 'typename' prior to dependent type name}}
|
||||
}
|
||||
|
||||
template void function_missing_typename<D>();
|
||||
|
||||
}
|
||||
|
|
|
@ -152,40 +152,6 @@ 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}}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
extern void static_func();
|
||||
void static_func(); // expected-note {{previous declaration is here}}
|
||||
|
|
Loading…
Reference in New Issue