From: Douglas Gregor Date: Fri, 6 Nov 2009 01:14:41 +0000 (+0000) Subject: If we have a C-style cast, functional cast, or a static_cast to a X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b653c52d9176a4faecf923f792758f4454f7f78c;p=clang If we have a C-style cast, functional cast, or a static_cast to a class type, don't perform the array-to-pointer or function-to-pointer conversions, because we may end up binding a reference to a function or array. With this change, FileCheck now passes -fsyntax-only! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86211 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaCXXCast.cpp b/lib/Sema/SemaCXXCast.cpp index 76faddaa03..eb931f33a2 100644 --- a/lib/Sema/SemaCXXCast.cpp +++ b/lib/Sema/SemaCXXCast.cpp @@ -388,7 +388,7 @@ CheckStaticCast(Sema &Self, Expr *&SrcExpr, QualType DestType, return; } - if (!DestType->isLValueReferenceType()) + if (!DestType->isLValueReferenceType() && !DestType->isRecordType()) Self.DefaultFunctionArrayConversion(SrcExpr); unsigned msg = diag::err_bad_cxx_cast_generic; @@ -1104,7 +1104,7 @@ bool Sema::CXXCheckCStyleCast(SourceRange R, QualType CastTy, Expr *&CastExpr, if (CastTy->isDependentType() || CastExpr->isTypeDependent()) return false; - if (!CastTy->isLValueReferenceType()) + if (!CastTy->isLValueReferenceType() && !CastTy->isRecordType()) DefaultFunctionArrayConversion(CastExpr); // C++ [expr.cast]p5: The conversions performed by diff --git a/test/SemaCXX/cast-conversion.cpp b/test/SemaCXX/cast-conversion.cpp index cbc24aef28..936933d95d 100644 --- a/test/SemaCXX/cast-conversion.cpp +++ b/test/SemaCXX/cast-conversion.cpp @@ -19,3 +19,17 @@ int main () { // expected-warning {{expression result unused}} } +template +struct X0 { + X0(const T &); +}; + +template +X0 make_X0(const T &Val) { + return X0(Val); +} + +void test_X0() { + const char array[2]; + make_X0(array); +}