[ODRHash] Don't hash friend functions.

In certain combinations of templated classes and friend functions, the body
of friend functions does not get propagated along with function signature.
Exclude friend functions for hashing to avoid this case.

llvm-svn: 322350
This commit is contained in:
Richard Trieu 2018-01-12 04:42:27 +00:00
parent 64a0db76f9
commit 4eefb4511d
7 changed files with 68 additions and 0 deletions

View File

@ -478,6 +478,8 @@ void ODRHash::AddFunctionDecl(const FunctionDecl *Function) {
// TODO: Fix hashing for class methods.
if (isa<CXXMethodDecl>(Function)) return;
// And friend functions.
if (Function->getFriendObjectKind()) return;
// Skip functions that are specializations or in specialization context.
const DeclContext *DC = Function;

View File

@ -0,0 +1,14 @@
template <class T>
struct iterator {
void Compare(const iterator &x) { }
friend void Check(iterator) {}
};
template <class T = int> struct Box {
iterator<T> I;
void test() {
Check(I);
I.Compare(I);
}
};

View File

@ -0,0 +1,6 @@
#include "Box.h"
void Peek() {
Box<> Gift;
Gift.test();
}

View File

@ -0,0 +1,5 @@
#include "Box.h"
void x() {
Box<> Unused;
//Unused.test();
}

View File

@ -0,0 +1,7 @@
#include "Box.h"
#include "M2.h"
void Party() {
Box<> Present;
Present.test();
}

View File

@ -0,0 +1,15 @@
module Box {
header "Box.h"
}
module Module1 {
header "M1.h"
}
module Module2 {
header "M2.h"
}
module Module3 {
header "M3.h"
}

View File

@ -0,0 +1,19 @@
// RUN: rm -rf %t
// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/modules.cache \
// RUN: -I %S/Inputs/odr_hash-Friend \
// RUN: -emit-obj -o /dev/null \
// RUN: -fmodules \
// RUN: -fimplicit-module-maps \
// RUN: -fmodules-cache-path=%t/modules.cache \
// RUN: -std=c++11 -x c++ %s -verify
// expected-no-diagnostics
#include "Box.h"
#include "M1.h"
#include "M3.h"
void Run() {
Box<> Present;
}