diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-02-25 06:24:24 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-02-25 06:24:24 +0000 |
commit | e06a2c1893a64c50e2f0d9d0ad35a7d6bd639f93 (patch) | |
tree | 16a54ab6347f658e5c639e1a89adae217a4b0946 /clang/test/SemaCXX/overload-call.cpp | |
parent | 6fd2b434bda75bff8fd9d597e7da26fa281cd8b1 (diff) | |
download | bcm5719-llvm-e06a2c1893a64c50e2f0d9d0ad35a7d6bd639f93.tar.gz bcm5719-llvm-e06a2c1893a64c50e2f0d9d0ad35a7d6bd639f93.zip |
Fix a regression from r151117: ADL requires that we attempt to complete any
associated classes, since it can find friend functions declared within them,
but overload resolution does not otherwise require argument types to be
complete.
llvm-svn: 151434
Diffstat (limited to 'clang/test/SemaCXX/overload-call.cpp')
-rw-r--r-- | clang/test/SemaCXX/overload-call.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/clang/test/SemaCXX/overload-call.cpp b/clang/test/SemaCXX/overload-call.cpp index 501e2d6fb2f..913d13f99b8 100644 --- a/clang/test/SemaCXX/overload-call.cpp +++ b/clang/test/SemaCXX/overload-call.cpp @@ -536,10 +536,30 @@ namespace rdar9803316 { } namespace IncompleteArg { - // Ensure that overload resolution attempts to complete argument types. + // Ensure that overload resolution attempts to complete argument types when + // performing ADL. template<typename T> struct S { friend int f(const S&); }; extern S<int> s; int k = f(s); + + template<typename T> struct Op { + friend bool operator==(const Op &, const Op &); + }; + extern Op<char> op; + bool b = op == op; + + // ... and not in other cases! Nothing here requires U<int()> to be complete. + // (Note that instantiating U<int()> will fail.) + template<typename T> struct U { + T t; + }; + struct Consumer { + template<typename T> + int operator()(const U<T> &); + }; + template<typename T> U<T> &make(); + Consumer c; + int n = sizeof(c(make<int()>())); } |