]> granicus.if.org Git - clang/commitdiff
Defined friend functions are *implicitly* inlined, unless the inline specifier occurs...
authorAbramo Bagnara <abramo.bagnara@gmail.com>
Fri, 18 Mar 2011 15:21:59 +0000 (15:21 +0000)
committerAbramo Bagnara <abramo.bagnara@gmail.com>
Fri, 18 Mar 2011 15:21:59 +0000 (15:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@127877 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp

index 832864014aa89d37f07b5813cddc060addad379b..f4381b235d5482b60631fc39690e7459cfbb8711 100644 (file)
@@ -3669,14 +3669,6 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
                              AbstractReturnType))
       D.setInvalidType();
 
-
-    if (isFriend) {
-      // C++ [class.friend]p5
-      //   A function can be defined in a friend declaration of a
-      //   class . . . . Such a function is implicitly inline.
-      isInline |= IsFunctionDefinition;
-    }
-
     if (Name.getNameKind() == DeclarationName::CXXConstructorName) {
       // This is a C++ constructor declaration.
       assert(DC->isRecord() &&
@@ -3774,6 +3766,14 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,
                                    NameInfo, R, TInfo, SC, SCAsWritten, isInline,
                                    true/*HasPrototype*/);
     }
+
+    if (isFriend && !isInline && IsFunctionDefinition) {
+      // C++ [class.friend]p5
+      //   A function can be defined in a friend declaration of a
+      //   class . . . . Such a function is implicitly inline.
+      NewFD->setImplicitlyInline();
+    }
+
     SetNestedNameSpecifier(NewFD, D);
     isExplicitSpecialization = false;
     isFunctionTemplateSpecialization = false;