118 lines
3.1 KiB
C++
118 lines
3.1 KiB
C++
//===--- pointer_arith.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.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// IWYU_ARGS: -I .
|
|
|
|
// Pointer arithmetic requires the full type of the pointed-to type, because
|
|
// type size is material to the calculations.
|
|
|
|
#include "tests/cxx/direct.h"
|
|
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
IndirectClass ic1, ic2;
|
|
|
|
void PointerArithmetic() {
|
|
// IWYU: IndirectClass needs a declaration
|
|
IndirectClass* p1 = &ic1;
|
|
// IWYU: IndirectClass needs a declaration
|
|
IndirectClass* p2 = &ic2;
|
|
|
|
// All the pointer arithmetic below require the full type.
|
|
|
|
// Pointer minus pointer (should really use ptrdiff_t, but I don't want to
|
|
// have to include headers for it)
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
long x = p2 - p1;
|
|
|
|
// Pointer minus offset
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
void* p3 = p1 - 20;
|
|
|
|
// Pointer decrement
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
p1 -= 10;
|
|
|
|
// Pointer plus offset
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
p3 = p1 + 100;
|
|
|
|
// Pointer increment
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
p1 += 100;
|
|
}
|
|
|
|
// IWYU: IndirectTemplate is...*indirect.h
|
|
// IWYU: IndirectClass needs a declaration
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
IndirectTemplate<IndirectClass> itc1, itc2;
|
|
|
|
void PointerArithmeticWithTemplates() {
|
|
// IWYU: IndirectTemplate needs a declaration
|
|
// IWYU: IndirectClass needs a declaration
|
|
IndirectTemplate<IndirectClass>* p1 = &itc1;
|
|
// IWYU: IndirectTemplate needs a declaration
|
|
// IWYU: IndirectClass needs a declaration
|
|
IndirectTemplate<IndirectClass>* p2 = &itc2;
|
|
|
|
// All the pointer arithmetic below require the full type.
|
|
|
|
// Pointer minus pointer
|
|
// IWYU: IndirectTemplate is...*indirect.h
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
long x = p2 - p1;
|
|
|
|
// Pointer minus offset
|
|
// IWYU: IndirectTemplate is...*indirect.h
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
void* p3 = p1 - 20;
|
|
|
|
// Pointer decrement
|
|
// IWYU: IndirectTemplate is...*indirect.h
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
p1 -= 10;
|
|
|
|
// Pointer plus offset
|
|
// IWYU: IndirectTemplate is...*indirect.h
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
p3 = p1 + 100;
|
|
|
|
// Pointer increment
|
|
// IWYU: IndirectTemplate is...*indirect.h
|
|
// IWYU: IndirectClass is...*indirect.h
|
|
p1 += 100;
|
|
}
|
|
|
|
// Make sure pointer arithmetic with builtins does not yield IWYU warnings.
|
|
void BuiltinPointerArithmetic() {
|
|
char c = 0;
|
|
char* pc = &c;
|
|
pc -= 10;
|
|
pc += 100;
|
|
long x = pc - &c;
|
|
|
|
int i = 0;
|
|
int* pi = &i;
|
|
pi -= 20;
|
|
pi += 200;
|
|
x = pi - &i;
|
|
}
|
|
|
|
/**** IWYU_SUMMARY
|
|
|
|
tests/cxx/pointer_arith.cc should add these lines:
|
|
#include "tests/cxx/indirect.h"
|
|
|
|
tests/cxx/pointer_arith.cc should remove these lines:
|
|
- #include "tests/cxx/direct.h" // lines XX-XX
|
|
|
|
The full include-list for tests/cxx/pointer_arith.cc:
|
|
#include "tests/cxx/indirect.h" // for IndirectClass, IndirectTemplate
|
|
|
|
***** IWYU_SUMMARY */
|