1418 Commits

Author SHA1 Message Date
Fariborz Jahanian
4dc1246d87 Use the new API for applying the qualifiers on built-in '->*'
operator's types.

llvm-svn: 83648
2009-10-09 16:34:40 +00:00
Fariborz Jahanian
29f9d39568 Improve on reporting ambiguity involving built-in candidates.
I still don't like it but it is improvement over what we had.

llvm-svn: 83603
2009-10-09 00:13:15 +00:00
Anders Carlsson
6c966c458a Handle MemberExprs in ResolveAddressOfOverloadedFunction.
llvm-svn: 83495
2009-10-07 22:26:29 +00:00
Fariborz Jahanian
ae01f78a31 When building candidate set for built-ins; when looking for
convesion functions, look in base classes to.
(Removes a FIXME).

llvm-svn: 83472
2009-10-07 17:26:09 +00:00
Fariborz Jahanian
12df37c5d7 Removed couple of unnecessary canonicalization
per Doug's obsevation.

llvm-svn: 83464
2009-10-07 16:56:50 +00:00
Fariborz Jahanian
34d93dcddd Patch to implement C++ [over.built]p11 of overload resolution.
Doug, please review. There is a FIXME in the test case with a question
which is unrelated to this patch (that is, error is issued
before set of builtins are added to the candidate list).

llvm-svn: 83429
2009-10-06 23:08:05 +00:00
Douglas Gregor
36d1b14dde Refactor the code that walks a C++ inheritance hierarchy, searching
for bases, members, overridden virtual methods, etc. The operations
isDerivedFrom and lookupInBases are now provided by CXXRecordDecl,
rather than by Sema, so that CodeGen and other clients can use them
directly.

llvm-svn: 83396
2009-10-06 17:59:45 +00:00
Fariborz Jahanian
333bb733a5 Refixed pr5086 by letting Expr::isNullPointerConstant
handle checking for a null pointer for a zero-valued
enumerator; moving the test case from CodeGen to Sema.

llvm-svn: 83350
2009-10-06 00:09:31 +00:00
Fariborz Jahanian
a0f91ad59c enumerator value of 0 is not a null pointer constant for
deciding const of null pointer conversion. Fixes PR5086.

llvm-svn: 83217
2009-10-01 22:10:15 +00:00
Fariborz Jahanian
b3c44f9ee9 Patch to implement static casting which requires one
user-defined type conversion. Fixes PR5040.

llvm-svn: 83211
2009-10-01 20:39:51 +00:00
Douglas Gregor
66950a32d9 When overload resolution fails for an overloaded operator, show the
overload candidates (but not the built-in ones). We still rely on the
underlying built-in semantic analysis to produce the initial
diagnostic, then print the candidates following that diagnostic. 

One side advantage of this approach is that we can perform more validation
of C++'s operator overloading with built-in candidates vs. the
semantic analysis for those built-in operators: when there are no
viable candidates, we know to expect an error from the built-in
operator handling code. Otherwise, we are not modeling the built-in
semantics properly within operator overloading. This is checked as:

      assert(Result.isInvalid() && 
             "C++ binary operator overloading is missing
             candidates!");
      if (Result.isInvalid())
        PrintOverloadCandidates(CandidateSet, /*OnlyViable=*/false);

The assert() catches cases where we're wrong in a +Asserts build. The
"if" makes sure that, if this happens in a production clang
(-Asserts), we still build the proper built-in operator and continue
on our merry way. This is effectively what happened before this
change, but we've added the assert() to catch more flies.

llvm-svn: 83175
2009-09-30 21:46:01 +00:00
Fariborz Jahanian
ac3005cecc Note location of operators caused the circularity.
llvm-svn: 83153
2009-09-30 17:46:20 +00:00
Fariborz Jahanian
91ae9fd9e8 Fixes a nasty bug which only turned up in 32bit build of clang and
had to do with an initialized field when multiple type conversions
are ambiguous but must be treated as user defined conversion for
overload resolution purposes.

llvm-svn: 83079
2009-09-29 17:31:54 +00:00
Fariborz Jahanian
78cfcb56a1 Define and use a helper method to call a type conversion
function.

llvm-svn: 83027
2009-09-28 23:23:40 +00:00
Fariborz Jahanian
9021fc7026 Minor API change. No change in functionality.
llvm-svn: 83022
2009-09-28 22:03:07 +00:00
Fariborz Jahanian
c9c3917a86 Multiple conversions to the same type are ambiguous but for the
purpose of overload resolution is to be treated as a uner-defined
conversion.

llvm-svn: 83004
2009-09-28 19:06:58 +00:00
Fariborz Jahanian
774cf79987 Patch for AST representation for the implicit conversion to a function
reference/pointer. And a test case for code gen.

llvm-svn: 83000
2009-09-28 18:35:46 +00:00
Douglas Gregor
5b0f2a2fbe Don't allow the same function to enter the overload candidate set
multiple times. This requires to be more careful about re-adding
candidates cached from the function template definition.

llvm-svn: 82967
2009-09-28 04:47:19 +00:00
Douglas Gregor
fae1d71592 Yet another simplifying use of Sema::getMostSpecialized
llvm-svn: 82844
2009-09-26 03:56:17 +00:00
Douglas Gregor
56751b5981 Fix checking for a null pointer constant when the expression itself is
value-dependent. Audit (and fixed) all calls to
Expr::isNullPointerConstant() to provide the correct behavior with
value-dependent expressions. Fixes PR5041 and a crash in libstdc++
<locale>.

In the same vein, properly compute value- and type-dependence for
ChooseExpr. Fixes PR4996.

llvm-svn: 82748
2009-09-25 04:25:58 +00:00
Douglas Gregor
3a923c2d37 WIP implementation of explicit function template specialization. This
first implementation recognizes when a function declaration is an
explicit function template specialization (based on the presence of a
template<> header), performs template argument deduction + ambiguity
resolution to determine which template is being specialized, and hooks

There are many caveats here:
  - We completely and totally drop any explicitly-specified template
  arguments on the floor
  - We don't diagnose any of the extra semantic things that we should
  diagnose. 
  - I haven't looked to see that we're getting the right linkage for
  explicit specializations

On a happy note, this silences a bunch of errors that show up in
libstdc++'s <iostream>, although Clang still can't get through the
entire header.

llvm-svn: 82728
2009-09-24 23:14:47 +00:00
John McCall
8ccfcb51ee Refactor the representation of qualifiers to bring ExtQualType out of the
Type hierarchy.  Demote 'volatile' to extended-qualifier status.  Audit our
use of qualifiers and fix a few places that weren't dealing with qualifiers
quite right;  many more remain.

llvm-svn: 82705
2009-09-24 19:53:00 +00:00
Douglas Gregor
c809cc2efa Improve diagnostic location information when checking the initialization of a reference
llvm-svn: 82666
2009-09-23 23:04:10 +00:00
Douglas Gregor
2a920014d3 When code-completion after a "," is building an overload set, note
that there is one more argument (the one following the comma) and make
the candidate non-viable if the function cannot accept any argument in
that position.

llvm-svn: 82625
2009-09-23 14:56:09 +00:00
Fariborz Jahanian
21ccf06352 Produce detailed diagnostics when overload
resolution failed to select a candidate due to
ambiguity in type conversion function selection.

llvm-svn: 82596
2009-09-23 00:58:07 +00:00
Fariborz Jahanian
f0647a5fbc Code refactoring and cleanup.
llvm-svn: 82566
2009-09-22 20:24:30 +00:00
Fariborz Jahanian
0b51c729c9 Issue good ambiguity diagnostic when convesion fails.
llvm-svn: 82565
2009-09-22 19:53:15 +00:00
Douglas Gregor
cabea40ea3 Implement code completion within a function call, triggered after the
opening parentheses and after each comma. We gather the set of visible
overloaded functions, perform "partial" overloading based on the set
of arguments that we have thus far, and return the still-viable
results sorted by the likelihood that they will be the best candidate.

Most of the changes in this patch are a refactoring of the overloading
routines for a function call, since we needed to separate out the
notion of building an overload set (common to code-completion and
normal semantic analysis) and then what to do with that overload
set. As part of this change, I've pushed explicit template arguments
into a few more subroutines.

There is still much more work to do in this area. Function templates
won't be handled well (unless we happen to deduce all of the template
arguments before we hit the completion point), nor will overloaded
function-call operators or calls to member functions.

llvm-svn: 82549
2009-09-22 15:41:20 +00:00
John McCall
9dd450bb78 Change all the Type::getAsFoo() methods to specializations of Type::getAs().
Several of the existing methods were identical to their respective
specializations, and so have been removed entirely.  Several more 'leaf'
optimizations were introduced.

The getAsFoo() methods which imposed extra conditions, like
getAsObjCInterfacePointerType(), have been left in place.

llvm-svn: 82501
2009-09-21 23:43:11 +00:00
Douglas Gregor
4fb9cde8ef When printing an overload candidate that is a function template specialization,
point at the template and print out its template arguments, e.g.,

ambiguous-ovl-print.cpp:5:8: note: candidate function template specialization
      [with T = int]
  void f(T*, long);

llvm-svn: 81907
2009-09-15 20:11:42 +00:00
Fariborz Jahanian
3e6b57e593 Issue good diagnostics when initialization failes due to
ambiguity in type conversion function selection.

llvm-svn: 81898
2009-09-15 19:12:21 +00:00
Fariborz Jahanian
19c7328881 Issue a good diagnostics when attempt to select
a type convesion function results in ambiguity.

llvm-svn: 81812
2009-09-15 00:10:11 +00:00
Douglas Gregor
6010da024c Implement partial ordering of function templates when calling a
conversion function.

llvm-svn: 81807
2009-09-14 23:02:14 +00:00
Douglas Gregor
48bc374d1e Test function template partial ordering when resolving the address of
an overloaded function (template).

llvm-svn: 81804
2009-09-14 22:02:01 +00:00
Fariborz Jahanian
f4061e39a3 Used visible conversion function api to do overload
resolution of type conversion functions in base and
current class.

llvm-svn: 81784
2009-09-14 20:41:01 +00:00
Douglas Gregor
0ff7d92048 Implement partial ordering of function template specializations
(C++ [temp.func.order]). 

llvm-svn: 81777
2009-09-14 18:39:43 +00:00
Anders Carlsson
7ec8ccde01 Use the correct CastKind for derived-to-base pointer conversions.
llvm-svn: 81608
2009-09-12 04:46:44 +00:00
Fariborz Jahanian
f9012a3e9d Undid my yesterday patch which is not needed with an upcoming patch.
llvm-svn: 81549
2009-09-11 18:46:22 +00:00
Anders Carlsson
78b5493994 Look for overloaded arrow operators in base classes.
llvm-svn: 81475
2009-09-10 23:18:36 +00:00
Fariborz Jahanian
c571f790fc Patch to collect conversion methods in base(s) and derived
class into a candidate set. 

llvm-svn: 81467
2009-09-10 22:26:16 +00:00
Mike Stump
11289f4280 Remove tabs, and whitespace cleanups.
llvm-svn: 81346
2009-09-09 15:08:12 +00:00
Douglas Gregor
84f14dd674 Preliminary AST representation and semantic analysis for
explicitly-specified template argument lists in member reference
expressions, e.g.,

  x->f<int>()

llvm-svn: 80646
2009-09-01 00:37:14 +00:00
Anders Carlsson
d20e795a5b Fix this for real.
llvm-svn: 80377
2009-08-28 16:57:08 +00:00
Anders Carlsson
759b78951e When doing overload resolution, expressions that are value dependent but not type dependent and of integral type should not be treated as null pointer constants.
llvm-svn: 80369
2009-08-28 15:55:56 +00:00
Anders Carlsson
228eea36a3 Pass InOverloadResolution all the way down to IsPointerConversion.
llvm-svn: 80368
2009-08-28 15:33:32 +00:00
Douglas Gregor
6a1f965853 When looking for overloaded member operators, make sure to instantiate
class template specializations (when possible) and look into base
classes. Thanks to Eli for the test case!

FIXME -=1.

llvm-svn: 80302
2009-08-27 23:35:55 +00:00
Anders Carlsson
20d1332d76 Add an InOverloadResolution flag to TryCopyInitialization.
llvm-svn: 80261
2009-08-27 17:37:39 +00:00
Anders Carlsson
271e3a4d47 Remove more default arguments.
llvm-svn: 80260
2009-08-27 17:30:43 +00:00
Anders Carlsson
ef4c72135f Remove default arguments from TryImplicitConversion and fix a bug found in the process.
llvm-svn: 80258
2009-08-27 17:24:15 +00:00
Anders Carlsson
03068aa077 Remove default argument from TryCopyInitialization.
llvm-svn: 80256
2009-08-27 17:18:13 +00:00