On Nov 20, 2008, at 5:30 AM, Douglas Gregor wrote:
This is the source line:
Lexer *L; char Res;
...
  L->Diag(CP-2, diag::trigraph_converted) << std::string()+Res;

The basic problem is that Diag() is returning a temporary, but a non- const (lvalue) reference can't bind to a temporary. I suggest making the first parameter to these operator<<'s either a const DiagnosticInfo& or a DiagnosticInfo. (The former will require a bunch of other member functions to be const, but so what?)

Right. It isn't logically const, but that will definitely fix it. I'll do it.


This is a good point where we can step back and look at the amazing awfulness of this diagnostic. It's 'pretty' printing out the expression in question, in a horribly mangled form. Then it dumps out a candidate list, but manages to not tell me the types that it actually *has* on the LHS/RHS of the <<.

We should use this kind of thing as a test case for our diagnostics, to see how clear we can make them.

I filed this PR with a testcase:
http://llvm.org/bugs/show_bug.cgi?id=3104

Interestingly enough, if you run clang on the .ii file, we get these diagnostics to start with:

Debug/Lexer.ii:2073:1: error: expected unqualified-id
template <typename T> struct SerializeTrait;
^
Debug/Lexer.ii:2228:12: error: incompatible type returning 'class SourceLocation', expected 'class SourceLocation'
    return X;
           ^
Debug/Lexer.ii:2209:12: error: incompatible type returning 'class SourceLocation', expected 'class SourceLocation'
    return getFileLoc(FileID, Offset);
           ^~~~~~~~~~~~~~~~~~~~~~~~~~
Debug/Lexer.ii:2164:12: error: incompatible type returning 'class SourceLocation', expected 'class SourceLocation'
    return L;
           ^
Debug/Lexer.ii:2144:12: error: incompatible type returning 'class SourceLocation', expected 'class SourceLocation'
    return L;
           ^
Debug/Lexer.ii:2239:14: error: no member named 'getRawEncoding'
  return LHS.getRawEncoding() == RHS.getRawEncoding();
         ~~~ ^
Debug/Lexer.ii:2261:35: error: no member named 'isValid'
  bool isValid() const { return B.isValid() && E.isValid(); }
                                ~ ^
Debug/Lexer.ii:2251:20: error: class constructors are not supported yet
  SourceRange(): B(SourceLocation()), E(SourceLocation()) {}
                   ^
Debug/Lexer.ii:2251:41: error: class constructors are not supported yet
  SourceRange(): B(SourceLocation()), E(SourceLocation()) {}
                                        ^
Debug/Lexer.ii:2294:24: error: functions that differ only in their return type cannot be overloaded
  const SourceManager& getManager() const {
                       ^
Debug/Lexer.ii:2289:18: error: previous declaration is here
  SourceManager& getManager() {
                 ^
...

The first issue is obvious (no templates). The new few look strange though and are probably easy to fix. The next couple are about methods not implemented. The 'not implemented' ones are very cute :). It looks like overloading + const methods isn't wired up yet.

It's pretty impressive how much C++ is starting to parse now!

-Chris

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to