PR13433: In Microsoft mode, don't require function calls within decltype

expressions to have complete return types (or accessible destructors). If the
return type is required to be complete for some other reason (for instance, if
it is needed by overload resolution), then it will still be required to be
complete. This is apparently required in order to parse a MSVC11 header.

llvm-svn: 160924
This commit is contained in:
Richard Smith 2012-07-28 19:54:11 +00:00
parent f7759e8fab
commit f86b0ae196
2 changed files with 19 additions and 0 deletions

View File

@ -4783,6 +4783,11 @@ ExprResult Sema::ActOnDecltypeExpression(Expr *E) {
// Disable the special decltype handling now.
Rec.IsDecltype = false;
// In MS mode, don't perform any extra checking of call return types within a
// decltype expression.
if (getLangOpts().MicrosoftMode)
return Owned(E);
// Perform the semantic checks we delayed until this point.
CallExpr *TopCall = dyn_cast<CallExpr>(E);
for (unsigned I = 0, N = Rec.DelayedDecltypeCalls.size(); I != N; ++I) {

View File

@ -1,4 +1,5 @@
// RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -Wc++11-narrowing -Wmicrosoft -verify -fms-extensions -std=c++11
// RUN: %clang_cc1 %s -triple i686-pc-win32 -fsyntax-only -Wc++11-narrowing -Wmicrosoft -verify -fms-extensions -std=c++11 -fms-compatibility -DMS_COMPAT
struct A {
@ -6,3 +7,16 @@ struct A {
};
int b = 3;
A var = { b }; // expected-warning {{ cannot be narrowed }} expected-note {{override}}
namespace PR13433 {
struct S;
S make();
template<typename F> auto x(F f) -> decltype(f(make()));
#ifndef MS_COMPAT
// expected-error@-2{{calling 'make' with incomplete return type 'PR13433::S'}}
// expected-note@-5{{'make' declared here}}
// expected-note@-7{{forward declaration of 'PR13433::S'}}
#endif
}