Extract function pointer tests out of badinc

This commit is contained in:
Kim Grasman 2017-05-01 12:55:10 +02:00 committed by Kim Gräsman
parent 34baf6e65c
commit 78d0c15b37
6 changed files with 256 additions and 37 deletions

View File

@ -116,6 +116,7 @@ class OneIwyuTest(unittest.TestCase):
'backwards_includes.cc': ['.'],
'badinc.cc': ['.'],
'badinc-extradef.cc': ['.'],
'funcptrs.cc': ['.'],
'casts.cc': ['.'],
'catch.cc': ['.'],
'check_also.cc': ['.'],

View File

@ -115,7 +115,6 @@ class I1_TemplateMethodOnlyClass {
public:
FOO a() { FOO retval; return retval; }
FOO* b() { FOO* retval = NULL; return retval; }
static int stat() { FOO foo; (void)foo; return 2; }
template<typename BAR> BAR c() { return BAR(); }
template<typename BAR> BAR* d() { BAR* retval = NULL; return retval; }
template<typename BAR> int e(BAR* b) { return (int)b->size(); }

View File

@ -1886,42 +1886,6 @@ int main() {
local_d1_copy_class = D1CopyClassFn(I12);
local_d1_copy_class.a();
// Test (templated) function pointers and method pointers.
// IWYU: I1_Class needs a declaration
// IWYU: I1_Enum is...*badinc-i1.h
// IWYU: I1_Function is...*badinc-i1.h
I1_Enum (*local_fn_ptr)(I1_Class*) = &I1_Function;
// IWYU: I1_Class is...*badinc-i1.h
int (*static_method_ptr)() = &I1_Class::s;
// IWYU: I1_Struct is...*badinc-i1.h
// IWYU: I1_Struct needs a declaration
// IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
int (*tpl_fn_ptr)() = &I1_TemplateMethodOnlyClass<I1_Struct>::stat;
// IWYU: I1_Class is...*badinc-i1.h
// IWYU: I1_Class needs a declaration
// IWYU: I1_Struct needs a declaration
// IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
int (*tpl_fn_ptr2)() = &I1_TemplateMethodOnlyClass<I1_Struct>::t<I1_Class>;
// IWYU: I1_Class is...*badinc-i1.h
int (I1_Class::*method_ptr)() const = &I1_Class::a;
// IWYU: I1_Struct is...*badinc-i1.h
// IWYU: I1_Struct needs a declaration
// IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
I1_Struct (I1_TemplateMethodOnlyClass<I1_Struct>::*tpl_method_ptr)()
// IWYU: I1_Struct is...*badinc-i1.h
// IWYU: I1_Struct needs a declaration
// IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
= &I1_TemplateMethodOnlyClass<I1_Struct>::a;
// IWYU: I1_Struct needs a declaration
// IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
// IWYU: I2_Struct is...*badinc-i2.h
I2_Struct (I1_TemplateMethodOnlyClass<I1_Struct>::*tpl_method_ptr2)()
// IWYU: I1_Struct needs a declaration
// IWYU: I2_Struct is...*badinc-i2.h
// IWYU: I2_Struct needs a declaration
// IWYU: I1_TemplateMethodOnlyClass is...*badinc-i1.h
= &I1_TemplateMethodOnlyClass<I1_Struct>::c<I2_Struct>;
// Check use of a macro inside an #ifdef.
// IWYU: I2_MACRO is...*badinc-i2.h
#ifdef I2_MACRO

15
tests/cxx/funcptrs-d1.h Normal file
View File

@ -0,0 +1,15 @@
//===--- funcptrs-d1.h - test input file for iwyu -------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_D1_H_
#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_D1_H_
#include "tests/cxx/funcptrs-i1.h"
#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_D1_H_

70
tests/cxx/funcptrs-i1.h Normal file
View File

@ -0,0 +1,70 @@
//===--- funcptrs-i1.h - test input file for iwyu -------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_I1_H_
#define INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_I1_H_
// Supporting types.
enum Enum { E_one };
class Retval {
public:
Retval() : value(0) {}
Retval(int v) : value(v) {}
int Value() const { return value; }
private:
int value;
};
// Functions of various kinds to which function pointers are bound.
class Class {
public:
int MemberFunction() const { return 20; }
template<typename R>
int MemberTemplate() const { return R(50).Value(); }
static int StaticMemberFunction() { return 100; }
template<typename R>
static int StaticMemberTemplate() {
return R(100).Value();
}
};
Enum Function(Class*) {
return E_one;
}
template<typename T>
int FunctionTemplate(Class*) {
return T(10).Value();
}
template<typename T>
class ClassTemplate {
public:
int MemberFunction() const { return 20; }
template<typename R>
int MemberTemplate() const { return R(50).Value(); }
static int StaticMemberFunction() {
return 100;
}
template<typename R>
static int StaticMemberTemplate() {
return R(100).Value();
}
};
#endif // INCLUDE_WHAT_YOU_USE_TESTS_CXX_FUNCPTRS_I1_H_

170
tests/cxx/funcptrs.cc Normal file
View File

@ -0,0 +1,170 @@
//===--- funcptrs.cc - test input file for iwyu ---------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// Tests that function pointers make the right claims for involved types.
// Function pointer expressions come in two flavors:
//
// 1) Assignments: int (*fptr)(int) = function
// 2) Calls: FunctionThatTakesFptr(function);
//
// A 'function' can be a free function, a static member function, a member
// function, or any template instantiation of the above.
#include "tests/cxx/funcptrs-d1.h"
// Functions to drive call-syntax.
// IWYU: Class needs a declaration
// IWYU: Enum is...*funcptrs-i1.h
void FunctionThatTakesFptr(Enum (*fptr)(Class*));
// IWYU: Class needs a declaration
void FunctionThatTakesFptr(int (*fptr)(Class*));
void FunctionThatTakesFptr(int (*fptr)());
// IWYU: Class needs a declaration
void FunctionThatTakesMptr(int (Class::*mptr)() const);
// IWYU: ClassTemplate needs a declaration
// IWYU: Class needs a declaration
void FunctionThatTakesMptr(int (ClassTemplate<Class>::*mptr)() const);
// Test cases below.
// Note that we test primarily the diagnostics from IWYU for the individual
// constructs, not which header is chosen -- all relevant types are in
// funcptrs-i1.h anyway.
//
// Each test creates function pointers to a plain function and a template
// instantiation, and for classes similarly for instance member functions.
void FreeFunctions() {
// Assignment of function pointer to function and template instantiation.
// IWYU: Class needs a declaration
// IWYU: Enum is...*funcptrs-i1.h
// IWYU: Function is...*funcptrs-i1.h
Enum (*fptr)(Class*) = &Function;
// IWYU: Class needs a declaration
// IWYU: Retval needs a declaration
// IWYU: Retval is...*funcptrs-i1.h
// IWYU: FunctionTemplate is...*funcptrs-i1.h
int (*template_fptr)(Class*) = &FunctionTemplate<Retval>;
// Call with function pointer to function and template instantiation.
// IWYU: Function is...*funcptrs-i1.h
FunctionThatTakesFptr(Function);
// IWYU: Retval needs a declaration
// IWYU: Retval is...*funcptrs-i1.h
// IWYU: FunctionTemplate is...*funcptrs-i1.h
FunctionThatTakesFptr(FunctionTemplate<Retval>);
}
void ClassMembers() {
// IWYU: Class is...*funcptrs-i1.h
int (*static_method_ptr)() = &Class::StaticMemberFunction;
// IWYU: Class is...*funcptrs-i1.h
// IWYU: Retval needs a declaration
// IWYU: Retval is...*funcptrs-i1.h
int (*static_template_method_ptr)() = &Class::StaticMemberTemplate<Retval>;
// IWYU: Class is...*funcptrs-i1.h
int (Class::*method_ptr)() const = &Class::MemberFunction;
// IWYU: Class is...*funcptrs-i1.h
// IWYU: Retval needs a declaration
// IWYU: Retval is...*funcptrs-i1.h
int (Class::*template_method_ptr)() const = &Class::MemberTemplate<Retval>;
// Call with pointers to static member function and template instantiation.
// IWYU: Class is...*funcptrs-i1.h
FunctionThatTakesFptr(Class::StaticMemberFunction);
// IWYU: Retval needs a declaration
// IWYU: Retval is...*funcptrs-i1.h
// IWYU: Class is...*funcptrs-i1.h
FunctionThatTakesFptr(Class::StaticMemberTemplate<Retval>);
// Call with pointers to instance member function and template instantiation.
// IWYU: Class is...*funcptrs-i1.h
FunctionThatTakesMptr(&Class::MemberFunction);
// IWYU: Retval needs a declaration
// IWYU: Retval is...*funcptrs-i1.h
// IWYU: Class is...*funcptrs-i1.h
FunctionThatTakesMptr(&Class::MemberTemplate<Retval>);
}
void ClassTemplateMembers() {
// IWYU: ClassTemplate is...*funcptrs-i1.h
// IWYU: Class needs a declaration
int (*static_method_ptr)() = &ClassTemplate<Class>::StaticMemberFunction;
int (*static_template_method_ptr)() =
// IWYU: ClassTemplate is...*funcptrs-i1.h
// IWYU: Class needs a declaration
// IWYU: Retval needs a declaration
// IWYU: Retval is...*funcptrs-i1.h
&ClassTemplate<Class>::StaticMemberTemplate<Retval>;
// IWYU: ClassTemplate is...*funcptrs-i1.h
// IWYU: Class needs a declaration
int (ClassTemplate<Class>::*method_ptr)() const =
// IWYU: ClassTemplate is...*funcptrs-i1.h
// IWYU: Class needs a declaration
&ClassTemplate<Class>::MemberFunction;
// IWYU: ClassTemplate is...*funcptrs-i1.h
// IWYU: Class needs a declaration
int (ClassTemplate<Class>::*template_method_ptr)() const =
// IWYU: ClassTemplate is...*funcptrs-i1.h
// IWYU: Class needs a declaration
// IWYU: Retval needs a declaration
// IWYU: Retval is...*funcptrs-i1.h
&ClassTemplate<Class>::MemberTemplate<Retval>;
// Call with pointers to static member function and template instantiation.
// IWYU: ClassTemplate is...*funcptrs-i1.h
// IWYU: Class needs a declaration
FunctionThatTakesFptr(ClassTemplate<Class>::StaticMemberFunction);
// IWYU: Retval needs a declaration
// IWYU: Retval is...*funcptrs-i1.h
// IWYU: ClassTemplate is...*funcptrs-i1.h
// IWYU: Class needs a declaration
FunctionThatTakesFptr(ClassTemplate<Class>::StaticMemberTemplate<Retval>);
// Call with pointers to instance member function and template instantiation.
// IWYU: ClassTemplate is...*funcptrs-i1.h
// IWYU: Class needs a declaration
FunctionThatTakesMptr(&ClassTemplate<Class>::MemberFunction);
// IWYU: Retval needs a declaration
// IWYU: Retval is...*funcptrs-i1.h
// IWYU: ClassTemplate is...*funcptrs-i1.h
// IWYU: Class needs a declaration
FunctionThatTakesMptr(&ClassTemplate<Class>::MemberTemplate<Retval>);
}
/**** IWYU_SUMMARY
tests/cxx/funcptrs.cc should add these lines:
#include "tests/cxx/funcptrs-i1.h"
tests/cxx/funcptrs.cc should remove these lines:
- #include "tests/cxx/funcptrs-d1.h" // lines XX-XX
The full include-list for tests/cxx/funcptrs.cc:
#include "tests/cxx/funcptrs-i1.h" // for Class, ClassTemplate, Enum, Function, FunctionTemplate, Retval
***** IWYU_SUMMARY */