llvm-project/clang/test/SemaCXX/incomplete-call.cpp
Richard Trieu 553b2b2e5d Modify how the -verify flag works. Currently, the verification string and
diagnostic message are compared.  If either is a substring of the other, then
no error is given.  This gives rise to an unexpected case:

  // expect-error{{candidate function has different number of parameters}}

will match the following error messages from Clang:

  candidate function has different number of parameters (expected 1 but has 2)
  candidate function has different number of parameters

It will also match these other error messages:

  candidate function
  function has different number of parameters
  number of parameters

This patch will change so that the verification string must be a substring of
the diagnostic message before accepting.  Also, all the failing tests from this
change have been corrected.  Some stats from this cleanup:

87 - removed extra spaces around verification strings
70 - wording updates to diagnostics
40 - extra leading or trailing characters (typos, unmatched parens or quotes)
35 - diagnostic level was included (error:, warning:, or note:)
18 - flag name put in the warning (-Wprotocol)

llvm-svn: 146619
2011-12-15 00:38:15 +00:00

50 lines
2.1 KiB
C++

// RUN: %clang_cc1 -fsyntax-only -verify %s
struct A; // expected-note 14 {{forward declaration of 'A'}}
A f(); // expected-note {{'f' declared here}}
struct B {
A f(); // expected-note {{'f' declared here}}
A operator()(); // expected-note 2 {{'operator()' declared here}}
operator A(); // expected-note {{'operator A' declared here}}
A operator!(); // expected-note 2 {{'operator!' declared here}}
A operator++(int); // expected-note {{'operator++' declared here}}
A operator[](int); // expected-note {{'operator[]' declared here}}
A operator+(int); // expected-note {{'operator+' declared here}}
A operator->(); // expected-note {{'operator->' declared here}}
};
void g() {
f(); // expected-error {{calling 'f' with incomplete return type 'A'}}
typedef A (*Func)();
Func fp;
fp(); // expected-error {{calling function with incomplete return type 'A'}}
((Func)0)(); // expected-error {{calling function with incomplete return type 'A'}}
B b;
b.f(); // expected-error {{calling 'f' with incomplete return type 'A'}}
b.operator()(); // expected-error {{calling 'operator()' with incomplete return type 'A'}}
b.operator A(); // expected-error {{calling 'operator A' with incomplete return type 'A'}}
b.operator!(); // expected-error {{calling 'operator!' with incomplete return type 'A'}}
!b; // expected-error {{calling 'operator!' with incomplete return type 'A'}}
b(); // expected-error {{calling 'operator()' with incomplete return type 'A'}}
b++; // expected-error {{calling 'operator++' with incomplete return type 'A'}}
b[0]; // expected-error {{calling 'operator[]' with incomplete return type 'A'}}
b + 1; // expected-error {{calling 'operator+' with incomplete return type 'A'}}
b->f(); // expected-error {{calling 'operator->' with incomplete return type 'A'}}
A (B::*mfp)() = 0;
(b.*mfp)(); // expected-error {{calling function with incomplete return type 'A'}}
}
struct C; // expected-note{{forward declaration}}
void test_incomplete_object_call(C& c) {
c(); // expected-error{{incomplete type in call to object of type}}
}