diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-11-06 01:14:41 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-11-06 01:14:41 +0000 |
| commit | ad8b22269efc89858f1ef2bf0ba35e9a12f1d26d (patch) | |
| tree | 9db5e95091fba5f46137a05c22602572c3a58677 /clang | |
| parent | 02ba0ea46137225189469670fec3aa237e8aed16 (diff) | |
| download | bcm5719-llvm-ad8b22269efc89858f1ef2bf0ba35e9a12f1d26d.tar.gz bcm5719-llvm-ad8b22269efc89858f1ef2bf0ba35e9a12f1d26d.zip | |
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!
llvm-svn: 86211
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaCXXCast.cpp | 4 | ||||
| -rw-r--r-- | clang/test/SemaCXX/cast-conversion.cpp | 14 |
2 files changed, 16 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp index 76faddaa038..eb931f33a2b 100644 --- a/clang/lib/Sema/SemaCXXCast.cpp +++ b/clang/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/clang/test/SemaCXX/cast-conversion.cpp b/clang/test/SemaCXX/cast-conversion.cpp index cbc24aef28d..936933d95d1 100644 --- a/clang/test/SemaCXX/cast-conversion.cpp +++ b/clang/test/SemaCXX/cast-conversion.cpp @@ -19,3 +19,17 @@ int main () { // expected-warning {{expression result unused}} } +template<class T> +struct X0 { + X0(const T &); +}; + +template<class T> +X0<T> make_X0(const T &Val) { + return X0<T>(Val); +} + +void test_X0() { + const char array[2]; + make_X0(array); +} |

